代码改变世界

C#学习笔记(五):类成员的定义

2006-01-10 13:30  努力学习的小熊  阅读(1071)  评论(0编辑  收藏  举报

一、定义域

标准的声明格式:

    class MyClass

    {

        public int MyInt;

    }

这种声明格式的成员是可以对其进行初始化的。但是它是Myclass的公有成员,可在实例化Myclass的对象后进行初始化或修改操作。

            MyClass myClass = new MyClass();

            myClass.MyInt = 1;

 

域(成员)也可以使用readonly关键字声明,表示这个域(成员)只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。

    class MyClass

    {

        public readonly int MyInt;

 

        public MyClass()

        {

            MyInt = 1;

        }

    }

    class MyClass

    {

        public readonly int MyInt = 2;

    }

 

如果我们使用关键字static将域声明为静态。

    class MyClass

    {

        public static int MyInt;

    }

我们要访问这个域(成员)则只能通过定义它的类来访问,通过类的对象实例是访问不到的。

            MyClass.MyInt = 10;

            Console.WriteLine("{0}",MyClass.MyInt);

 

二、定义方法

方法的使用和域基本一样,同样在使用了static关键字后,这个方法就只能通过类来访问,不能通过对象实例来访问。

1

    class MyClass

    {

        public string GetString()

        {

            return "Here is a string.";

        }

    }

            MyClass myClass = new MyClass();

            Console.WriteLine("{0}",myClass.GetString());

2

    class MyClass

    {

        public static string GetString()

        {

            return "Here is a string.";

        }

    }

            Console.WriteLine("{0}",MyClass.GetString());

 

但在方法的定义中,还可以使用以下几个关键字:

virtual:方法可以重写。

abstract:方法必须重写(只用于抽象类中)。

override:方法重写了一个基类方法(如果方法被重写,就必须使用关键字)。

extern:方法定义放在其他地方。

下面展示一个重载的例子:

    public class MyBaseClass

    {

        public virtual string DoSomething()

        {

            return "Old action.";

        }

    }

 

    public class MyDerivedClass : MyBaseClass

    {

        public override string DoSomething()

        {

            return "New action.";

        }

    }

 

    class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            MyBaseClass oldthing = new MyBaseClass();

            Console.WriteLine("{0}",oldthing.DoSomething());

 

            MyDerivedClass newthing = new MyDerivedClass();

            Console.WriteLine("{0}",newthing.DoSomething());

        }

    }

运行结果为:

我们在重写或定义方法的同时,如果使用了override关键字,那么我们也可以同时使用sealed关键字。使得派生类不能对此方法进行重载。大家请看下图:

我们在定义MyDerivedClass类中的DoSomething方法时没有使用sealed关键字,所以我们可以在它的派生类testOverride中重载这个方法。继续往下看:

这时,我们在定义MyDerivedClass类中的DoSomething方法使用了sealed关键字,实现了将这个方法进行密封,使得其派生类不能对这个方法进行重载。

 

三、定义属性

属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值。忽略get块创建只写属性,忽略set块创建只读属性。

        private int intVal;

 

        public int Val

        {

            get

            {

                return intVal;

            }

            set

            {

                if(value>=0 && value <=10)

                    intVal = value;

                else

                    throw(new ArgumentOutOfRangeException("Val",value,"Val must be assigned a value between 0 and 10."));

            }

        }