C#中实现多态的三种方式:抽象类,虚方法,接口


Interface(接口):是一种规则,要求继承类必需实现所有声明的成员,方法是公开的
Virtual方法(虚方法):可以在继承类里 Override覆盖重新的方方法,有自己的方法体。派生类可使用,可重写。
Abstract(抽象方法):只能在抽象类种修饰,并且没有具体的实现,抽象方法在派生类种 使用Override重写。

一、 抽象类
    抽象函数:只有函数定义,没有函数体的函数。例如:
abstract void fun()

       抽象类: 使用abstract定义的类称之为抽象类。记住:必须要被继承!

        特性:1.抽象类不能生成对象(生成一个对象就是new一个它,但抽象类中没有方法体,所以生成对象没有意义)
                    2.如果一个抽象类中含有一个抽象函数,那么这个类必须声明为抽象类;
                    3.如果你声明了一个抽象类,其中也可以不写抽象方法,这种情况一般用于不想让其生成对象时

    抽象类的构造函数()

        (1)不要再抽象类中定义public或protected internal访问权限的构造函数

        (2)应在抽象类中定义protected或private访问权限的构造函数

扫描二维码关注公众号,回复: 2637954 查看本文章

        (3)如果在抽象类中定义一个protected构造函数,则在实例化派生类时,基类可以执行初始化任务

using System;
using System.Collections;

//抽象类
public abstract class Animal
{
    protected string face;
    //声明为protected的构造函数,在实例化派生类时,基类可以执行初始化工作
    protected Animal() { this.face = "^_^"; /*抽象类构造函数初始化的例子*/}
    public abstract void eat();
    public abstract string Face
    {
        get;
    }
}

public class dog : Animal
{
    //重写基类中的抽象访问器Face
    public override string Face
    {
        get
        {
            return face;
        }
    }
    //重写基类中的抽象方法eat
    public override void eat()    {        Console.WriteLine("狗吃骨头 " + Face);
    }
}

public class cat : Animal
{
    public override string Face
    {
        get
        {
            return face;
        }
    }

    public override void eat()
    {
        Console.WriteLine("猫吃鱼 " + Face);
    }
}

public class panda : Animal
{
    public override string Face
    {
        get
        {
            return face;
        }
    }

    public override void eat()
    {
        Console.WriteLine("熊猫吃竹子 " + Face);
    }
}

public class MainFun
{
    static void Main()
    {
        Animal[] anim = new Animal[3];
        anim[0] = new dog();
        anim[1] = new cat();
        anim[2] = new panda();
        anim[0].eat();
        anim[1].eat();
        anim[2].eat();
        Console.ReadKey();
    }
}

二: 虚方法
    虚方法其实跟抽象差不太多,虚方法有方法体而抽象方法没有方法体,虚方法不一定非要重写出来, virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。

            java B类继承A类 B中方法c重载了A中c 其实就跟 C#中的虚方法一样 只是java中是默认的不需要再写了
            C# B类继承A类  B中方法c重载(override)了A中虚方法(virtual)c
三:接口
         为什么要用接口,接口有什么用?

    首先接口具有约束作用,可以限定类必须实现某些功能,接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构
    其次,接口减少了代码量,便于扩展,比如银行 账户等级越高,所具有的功能就越多(实现更多的接口),一个类可以有多个接口(interface
    再次,规范多个开发人员的代码,



猜你喜欢

转载自blog.csdn.net/One_Piece_Fu/article/details/81026363