3.9 多态

面向对象应用程序开发中,与传统的面向对象不同的是,面向对象具有很多的特性让开发变得简单和方便,代码便于阅读和维护,多态也是其中的重要的特性。多态可以分为两种,分别为动态多态和静态多态。上面章节中讲到的重载是多态的一种,重载是一种静态多态。

3.9.1 抽象方法
抽象方法是一个没有对类成员中方法进行具体实现的一种方法,抽象方法的实现必须让派生类实现。虽然抽象类中的所有方法不一定全是抽象方法,但是包含抽象方法的类被称作抽象类。抽象类可以使用abstract修饰符修饰类名称,抽象类中抽象方法的实现语法如下所示。
+展开
-C#
    public abstract class Animal //编写类
    {
        public abstract string Sound();//创建抽象方法
    }

上述代码中创建了抽象类abstract class Animal,同时创建了抽象方法Sound()。抽象方法不允许有方法体,同样不允许包含括号,只允许声明抽象方法。在派生类中,必须实现基类中的抽象方法,示例代码如下所示。
+展开
-C#
    public class People:Animal//派生自Animal类
    {
        public string country;
        public override string Sound()//实现抽象方法
        {
            return "language";//返回值
        }
    }

在派生类中,为了实现抽象的方法,就必须使用override关键字,来表示此方法是对基类的抽象方法的实现。使用抽象方法的好处在于,一位开发人员(可以是开发小组的组长或者软件构架设计师)可以创建一个或多个基类,来划分模块,或者按照功能划分和设计类,而小组的其他成员可以通过派生类来对基类进行实现,而设计基类的人员无需对类中方法的细节进行关心。同样,当修改代码时,也无需对基类进行修改,直接对派生类修改,防止当多个派生类派生于同一个基类时,出现不可预料的错误。

注意:Sound方法是一个抽象方法,在其他派生类中,如猫、狗,都有自己独特的叫声,而人类使用的是语言。不同的种别实现的方法千差万别,在基类中规定将属性规定死是非常不明智的做法。

3.9.2 覆盖
当基类创建了一个方法来描述类对象的时候,派生类的同一方法必须实现不同的细节,例如动物类中,初始化了方法中的声音的方法为“miaomiao”,那么在派生类中,可能声音的方法不是“miaomiao”,那么就可以对基类的方法进行覆盖,示例代码如下所示。
+展开
-C#
    public class Animal//创建基类
    {
        public string Sound()//基类中的Sound方法
        {
            return "miaomiao";//返回值
        }
    }
    public class People:Animal//创建派生类
    {
        public string country;//创建私有成员
        public string Sound()//覆盖派生类中的Sound方法
        {
            return "language";//返回值
        }
    }

派生类中使用了Sound方法,而基类中同样使用了此方法。当编译器编译代码的时候,会将派生类中的方法覆盖基类的方法,并在派生类中对象运行的时候,执行派生类中的方法,而不会执行基类中的方法。

注意:虽然派生类可以覆盖基类的方法,但是在设计类的时候,推荐使用抽象类或者接口来实现基类,因为这样便于阅读和维护,也提高了代码的安全性。

3.9.3 虚方法的抽象类
在类的设计中,可以使用abstract关键字修饰类为抽象类,那么在基类中就不需要实现抽象类,而必须在派生类中实现基类的方法。但是,如果在基类中,有多个方法来形容一个动物的特性,如飞行的特性可以用来形容鸟,而世界上很多动物都会飞行,但是人类是无法飞行的,所以在人类这个派生类中实现飞行的方法是没有必要,也是降低的代码的可读性的。这里就可以通过virtual关键字实现虚方法,让派生类能够选择是否实现该方法,示例代码如下所示。
+展开
-C#
    public class Animal//创建类
    {
        public virtual string Fly()//虚方法,飞行方法
        {
            return "Most Of The Animal Can Fly";//返回值
        }
    }
    public class People:Animal//创建派生类
    {
        public string country;//没有实现虚方法也可以
    }
    public class Bird : Animal//创建派生类
    { 
        public string FLY()//鸟儿能飞行,实现一个虚方法
        {
            return "It Can Fly";//返回值
        }
    }

上述代码中,人类不能飞行,所以没有必要实现Fly()方法,而鸟儿可以飞行,为了更好的描述一个对象,可以实现Fly()方法让对象能够飞行。

技巧:在类设计中,对于多数的派生类使用的方法,可以考虑将方法放置在基类中,当一个方法,例如飞行,有一些派生类不需要使用,如人类,则可以将此方法设置为虚方法。而当一个方法,例如吃东西,是每个派生类都必须使用的,则最好将此方法设计为抽象方法,强制每个开发人员必须实现该方法。

3.9.4 抽象属性
同方法相同的是,属性也可以使用抽象属性。同样,基类的派生类也必须实现基类的抽象属性的方法,示例代码如下所示。
+展开
-C#
    public class Animal//创建基类
    {
        public string Sound{get;set;}//创建sound属性
    }
    public class People:Animal//创建派生类
    {
        public string country;
        public string Sound { getset; }//覆盖基类属性
    }

当抽象属性为只读或只写属性时,可以移除相应的访问器简化代码并提高相应字段的安全性。

加支付宝好友偷能量挖...


评论(0)网络
阅读(110)喜欢(0)Asp.Net/C#/WCF