C#静多态与动多态

多态的本质:一个接口 不同实现 即多个功能

类别:静多态 动多态

一、静多态

函数的响应是在编译时发生的  主要包括函数重载和运算符重载两种

函数重载(overload) 同一作用域 方法名相同 参数列表必须不同 返回值类型可以不相同 其中参数列表不同包括参数类型不同或者参数个数不同

运算符会出新博客具体讲

二、动多态

函数的响应是在运行时发生的 动多态是由抽象类和虚方法实现 代码如下:

 class ShApe
    {
        protected int length;
        protected int width;

        public ShApe(int a = 0, int b = 0)
        {
            length = a;
            width = b;
        }


        public virtual int area()
        {
            Console.WriteLine("父类的面积:");
            return 0;
        }
    }

    class Bbox:ShApe
    {
        public Bbox(int a = 0, int b = 0) : base(a, b) { }
        public override int area()
        {
            Console.WriteLine("Bbox类的面积:");
            return length * width;
        }
    }

    class box: ShApe
    {
        public box(int a = 0, int b = 0) : base(a, b) { }
        public override int area()
        {
            Console.WriteLine("box类的面积:");
            return length * width / 2;
        }
    }

    class caller
    {
        public void CallArea(ShApe sh)
        {
            int a;
            a = sh.area();
            Console.WriteLine("面积:{0}",a);
        }
    }

 class integrated
    {
        static void Main(string[] args)
        {


            caller ca = new caller();
            Bbox bb = new Bbox(10, 20);
            box b = new box(100, 300);

            //编译时ca对应调用callArea 运行期间检测到bb  b 分别是Bbox box  则对应调用
            ca.CallArea(bb);
            ca.CallArea(b);
        }
}

重写(override) 子类中为满足自己的需求来重复定义某个方法的不同实现 需要使用override关键字 
 *    被重写的方法必须是虚方法 用的是virtual 
 *    相同的方法名 相同的参数列表 相同的返回值

覆盖(new) 指的是不同类(基类与派生类)有两个或多个返回类型、方法名、参数都相同 但是方法体不同的方法 这只是表面的覆盖 所以也叫隐藏 被覆盖的父类方法是可以被调用的 作用域问题

重载必然发生在一个类中 函数名相同 参数类型或顺序不同构成重载 与返回类型无关
重写必然发生在基类和派生类中 基类函数用virtual修饰 派生类用override修饰
覆盖 在子类中写一个和基类一样名字(参数不同也算)的非虚函数 会让基类中的函数被隐藏 编译后会提示要求使用new关键字

override重写特性
 * 由override声明重写的方法称为重写基方法 重写的基方法必须与override方法具有相同的签名
 * 重写的基方法必须是virtual abstract override的 不能重写非虚方法 静态方法
 * override方法与virtual的方法必须有相同的访问级别修饰符 不能更改virtual方法的可访问性
 * 不能使用new static virtual来修改override方法
 * 重写属性声明必须指定与继承属性完全相同的访问修饰符 类型 名称 并且被重写的属性是virtual abstract override的

三、抽象类

使用abstract创建抽象类 用于提供接口的部分类的实现 
 * 当一个派生类继承自该抽象类时 实现即完成
 * 抽象类包括 抽象方法 抽象方法可被派生类实现 

有关抽象类的规则
 * 1.不能创建一个抽象类的实例
 * 2.不能在一个抽象类外部声明一个抽象方法
 * 3.通过在类定义前面放置关键字sealed 可以将类声明为密封类 当一个类被sealed时 它不能被继承 
 * 4.由3可知抽象类不能被声明为sealed

一个简单的抽象类的代码示例:

//抽象类
    abstract class Shape
    {
        abstract public int area();
    }
    class Box : Shape
    {
        private int length;
        private int width;

        public Box(int x = 0,int y = 0)
        {
            length = x;
            width = y;
        }

        public override int area()
        {
            Console.WriteLine("Box的面积:");
            return length * width;
        }
    }

 class integrated
    {
        static void Main(string[] args)
        {
             Box b = new Box(10, 20);
            int a = b.area();
            Console.WriteLine(a);
        }
}

猜你喜欢

转载自blog.csdn.net/weixin_41966991/article/details/89284435