一个有关类基础知识的练习

看了一些有关类的贴子,感觉很多人对基本概念记的不牢,表述起来也是含糊不清的。尽管他们的想法是对的,可是表述的逻辑不太严谨。概念不清对编程有非常有害的。

自己也想为什么很多的人被斥之为眼高手低,或纸上谈兵?其实他们也很迷茫,不是他们不努力。我认为,主要是有这么一种风气,大家学习探讨都是在一种纯技术层次上,很少结合实际的例子。我看过大家很多代码,都是这样。久而久之,大家就形成了就技术说技术的习惯思维了,一旦真做起东西,就感会到无从下手。

这两天大家关于类的各个方面有很多的讨论。由于基础知识不清,或者说心中无底,这样说起话来,绕来绕去的,甚至象绕口令。其实,很多的概念单靠背是不行的,得靠练习写代码。当你从磕磕绊绊的、错误百出的练习中,练到能十分流利、精准美妙的把代码写出来,这些知识点也就烂熟于心了。

这是一个对类基础知识的练习,我是经过反复的练习。最后,不看参考书,10分钟内就可完成。这其中的一些名称我用了中文,是因为我没学习过英文,同时中文是自己的母语,理解起来也轻松不小。其实微软已经全面支持中文了,只不过大家觉得不够档次,用起来全都一样的。

--------------------------------------

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    //----------------------- 接口 ---------------------------------------------------------
    public interface I面积                      // 定义接口
    {
        int 面积                                    // 空属性
        {
            get;
        }
    }

    //----------------------- 抽象类 -------------------------------------------------------
    public abstract class 几何                  // 定义抽象类
    {
        protected string m名称;                // 声明字段

        public string 名称                         // 定义属性
        {
            get
            {
                return m名称;
            }
            set
            {
                m名称 = value;
            }
        }
    }

    //----------------------- 继承类 -------------------------------------------------------
    public class 矩形 : 几何, I面积                // 从抽象类与接口中继承
    {
        protected int m长度, m宽度;             // 声明字段

        public virtual int 长度                       // 定义虚拟属性
        {
            get
            {
                return m长度;
            }
            set
            {
                m长度 = value;
            }
        }

        public virtual int 宽度                 // 定义虚拟属性
        {
            get
            {
                return m宽度;
            }
            set
            {
                m宽度 = value;
            }
        }

        public int 面积                           // 实现继承于接口中的属性
        {
            get
            {
                return 长度 * 宽度;
            }
        }
    }

    //----------------------- 继承类 -------------------------------------------------------
    public class 方形 : 矩形                    // 再次继承
    {
        public override int 长度                // 重写属性,因方形的边长是相等的。
        {
            get
            {
                return base.长度;
            }
            set
            {
                base.长度 = value;
                base.宽度 = value;              // 将宽度等同长度
            }
        }

        public override int 宽度                // 重写属性,因方形的边长是相等的。
        {
            get
            {
                return 长度;                       // 用长度代替宽度
            }
            set
            {
                长度 = value;                     // 用长度代替宽度
            }
        }

        public int 边长                            // 定义属性,前面已将长度与宽度设置为相等
        {
            get
            {
                return 长度;
            }
            set
            {
                长度 = value;
            }
        }
    }

    //--------------------------------------------------------------------------------------
    class Program
    {
        public delegate string 委托(string arg);// 声明一个委托,接受并返回字符串

        static string 我是谁(string s)          // 定义义静态方法,接受并返回字符串
        {
            return "我的名字叫:" + s;          // 返回处理后的字符串
        }

        static void 计算面积(I面积 p)           // 定义静态方法,接受一个接口参数
        {
            Console.WriteLine("{0}的面积是: {1}", ((几何)p).名称, p.面积);
                                                          // 显示
        }

        static void Main(string[] args)        // 程序入口
        {
            矩形 矩 = new 矩形();               // 实例类
            矩.名称 = "矩形";                      // 赋值
            矩.长度 = 20;
            矩.宽度 = 10;

            方形 方 = new 方形();               // 实例类
            方.名称 = "方形";                      // 赋值
            方.边长 = 15;

            I面积[] j = new I面积[2];           // 实例接口类型的数组
            j[0] = 矩;                               // 赋值
            j[1] = 方;

            foreach ( I面积 a in j )             // 循环读取
            {
                计算面积(a);                       // 调用静态方法,显示结果

                Console.WriteLine();
            }
                       
            string 名1 = 矩.名称;               // 定义变量
            string 名2 = 方.名称;

            委托 d = new 委托(Program.我是谁);  // 初始委托,并用接受一个方法

            Console.WriteLine(d(名1));      // 关键理解:用委托接受的方法来处理名1

            Console.WriteLine();

            Console.WriteLine(d(名2));      // 关键理解:用委托接受的方法来处理名2

            Console.ReadKey();
        }
    }
}

 

这个程序您如果能运行几次,就会对类中的各种成员有深刻的感受了。

 

posted @ 2009-02-21 10:05  hxmhj  阅读(611)  评论(4编辑  收藏  举报