继承和多态

来源:互联网 发布:marryu相亲软件怎么样 编辑:程序博客网 时间:2024/04/27 22:07

面向对象的三个基本特征: 封装、继承、多态

 
继承是面向对象编程最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。在C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。
利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类,这一性质使得类支持分类的概念。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类。如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。
继承一个类时,成员的可访问性是一个重要的问题。子类不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用public声明成员,就可以让一个成员被基类和子类访问,同时也可以被外部的代码访问。
为了解决基类成员访问问题,C#还提供了另外一种可访问性——protected,只有派生类才能访问protected成员,基类和外部代码都不能访问protected成员。
除了成员的保护级别外,我们还可以为成员定义其继承行为。基类的成员可以是虚拟的,成员可以由继承它的类重写。子类可以提供成员的其他执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部代码不能访问它们。如果没有提供其他执行方式,外部代码就直接访问基类中成员的执行代码。
虚拟成员不能是私有成员,因为成员不能同时由子类重写也不能访问它。基类还可以定义为抽象类。抽象类不能直接实例化,要使用抽象类就必须继承这个类,然后再实例化。

说明:继承类时,需要使用冒号加类名。

//定义基类

    public class Class1

    {

        public void outMethod()

        {

            Console.WriteLine("这是基类");

        }

    }

    //定义继承类,该类继承于基类Class1

    public class Class2:Class1

    {

        public void outMethod2()

        {

            Console.WriteLine("这是继承类");

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Class1 class1 = new Class1();//实例化Class1类对象

            class1.outMethod();//调用Class1中的自定义方法

            Class2 class2 = new Class2();//实例化Class2类对象

            class2.outMethod();//使用Class2类对象调用从基类Class1中继承的自定义方法

            class2.outMethod2();//调用Class2中的自定义方法

        }

}

多态的概念及用途

继承使得派生类与基类在方法上有一定的重叠,因此可以使用相同的语法处理从同一个基类实例化的对象。
多态使得子类的实例可以直接赋予基类的变量(这里不需要进行强制类型转换),然后直接就可以通过这个变量调用基类的方法。
在派生于同一个类的不同对象上执行任务时,多态是一种极为有效的技巧,使用的代码最少。可以把一组对象放到一个数组中然后调用它们的方法,在这种情况下多态的作用就体现出来了,这些对象不必是相同类型的对象。当然如果它们都继承自某个类,可以把这些派生类都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。

 

 

//定义基类

    public class BaseClass

    {

        //定义一个virtual类型的方法,以便在派生类中重写该方法

        public virtual void DoWork() { }

        //定义一个virtual类型的只读属性,以便在派生类中重写该属性

        public virtual int WorkProperty

        {

            get { return 0; }

        }

    }

    //定义派生类

    public class DerivedClass : BaseClass

    {

        //重写基类中方法

        public override void DoWork() { }

        //重写基类中的只读属性

        public override int WorkProperty

        {

            get { return 0; }

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            DerivedClass B = new DerivedClass();

            B.DoWork();  //调用派生类中方法

            BaseClass A = (BaseClass)B;

            A.DoWork();  //也调用派生类中方法

        }

    }

说明:当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。

 

上面的实例重写了虚拟的基成员,另外,开发人员还可以使用新的派生成员替换基类的成员,这时需要使用new关键字。如果基类定义了一个方法、字段或属性,则new关键字用于在派生类中创建该方法、字段或属性的新定义。new关键字放置在要替换的类成员的返回类型之前,例如:

public class BaseClass

{

    public void DoWork() { }

    public int WorkProperty

    {

        get { return 0; }

    }

}

public class DerivedClass : BaseClass

{

    public new void DoWork() { }

    public new int WorkProperty

    {

        get { return 0; }

    }

}

原创粉丝点击