复习系列之多态

一 多态的定义:

同一种操作作用于不同的类的对象,不同的类的对象进行不同的执行,最后产生不同的执行结果。简单理解:让一种对象表现出来多种类型

二 多态的实现方式(虚方法):

(一)定义:

   在基类中用virtual关键字声明的方法叫做虚方法,在派生类中可以通过override关键字进行重写

(二)使用场景:

   明确定义了基类,对基类中的方法进行重写时,可以考虑使用虚方法。

(三)例子:

  

class Person      

     {

        private string _name;

        public string Name

        {

            get { return _name; }

            set { _name = value; }

        }

        public Person(string name)

        {

            this.Name = name;

        }

        public virtual void SayHello()

        {

            Console.WriteLine("我是人类");

        }

    }

    class Chinese:Person

    {

        public Chinese(string name)

            : base(name)

        { }

        public override void SayHello()

        {

            Console.WriteLine("你好,我的姓名是{0},我是中国人",this.Name);

        }

    }

    class Japanese:Person

    {

        public Japanese(string name)

            : base(name)

        { }

        public override void SayHello()

        {

            Console.WriteLine("你好,我的姓名是{0},我是日本人", this.Name);

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Chinese c1 = new Chinese("小明");

            Chinese c2 = new Chinese("小李");

            Japanese j1 = new Japanese("井泉宜良");

            Japanese j2 = new Japanese("龟田君");

            Person[] Pers = { c1, c2, j1, j2 };

            //Pers[0] = c1;

            //Pers[1] = c2;

            //Pers[2] = j1;

            //Pers[3] = j2;  上面数组的另外一种写法

            for (int i = 0; i < Pers.Length; i++)

            {

                Pers[i].SayHello();

            }

            //Person p = new Chinese("小明");//Japanese("bingbian");

            //p.SayHello();

            Console.ReadKey();

        }

    }

三 多态的实现方式(抽象方法)

(一)定义:

   描述共性的类就是抽象类,抽象类中的方法用abstract关键字修饰。其中抽象类并不考虑其实现的具体方式。

(二)成员:

抽象方法和非抽象方法;属性;字段;构造函数;实例成员

(三)使用场景

1在抽象类定义之前,如果其他类中,没有公共的基类,那么可以通过抽象出来共同的基类来实现共性的方法

2 如果父类中的方法有默认的实现,并且父类需要实例化,这时候可以考虑将 父类定义成一个普通类,用虚方法来实现多态

(四)例子

 

class Program

    {

        static void Main(string[] args)

        {

            Animal an = new Dog();

            an.Speak();

            Console.ReadKey();

        }

    }

   public  abstract  class Animal

    {

        public abstract void Speak();

    }

    class Dog:Animal

    {

        public override void Speak()

        {

            Console.WriteLine("狗汪汪的叫");

        }

    }

    class Cat:Animal

    {

        public override void Speak()

        {

            Console.WriteLine("猫喵喵的叫");

        }

    }

(五)注意事项:

   1. 抽象类成员必须标记为abstract,并且不能有任何实现,抽象成员必须下抽象类中

2.抽象类不能被实例化

3.子类继承抽象类后,必须把父类中的所有抽象成员都重写(除非子类也是一个抽象类,则不需要重写)

4.抽象成员的访问修饰符不能是private

5.在抽象类中可以包含实例成员,并且抽象类的实例成员可以不被子类实现

6.抽象类中是有构造函数的,虽然不能被实例化

7.如果父类的抽象方法中参数,那么,继承这个抽象父类的子类在重写父类的方法时候必须传入对应的参数。如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候也必须要传入返回值

8.如果父类中的方法有默认的实现,并且父类需要实例化,这时候可以考虑将 父类定义成一个普通类,用虚方法来实现多态

9.如果父类中的方法没有默认的实现。父类也不能实例化,则可以将该类定义为抽象类

四 多态的实现方式(接口)

(一)接口的定义:

接口是一种编程规范、能力,c#本身并不支持类的多重继承,但是通过接口可以实现类的多重继承

(二)成员:

   方法;索引器;事件;自动属性(没有字段和方法体的属性);不能有构造函数和字段

(三)使用场景:

要继承多个基类时,基类可以抽象为接口

(四)例子:

     class Program

    {

        static void Main(string[] args)

        {

            Ichlssable ch = new Teacher();

            ch.CHLSS();

            Console.ReadKey();

        }

    }

    interface Ichlssable

    {

         void CHLSS();

    }

    class Driver

    {

        public void KaiChe()

        {

            Console.WriteLine("我是一名司机,可以开车");

        }

    }

    class Teacher:Driver,Ichlssable

    {

        public void Teach()

        {

            Console.WriteLine("我是一名老师,可以教书");

            base.KaiChe();

        }

        public void CHLSS()

        {

            Console.WriteLine("我是人类,可以吃喝拉撒睡");

        }

    }

(五)注意事项:

  1.一个类继承了接口,这个类就需要实现接口中的所有成员

2.接口不能被实例化,也就是说不能用new创建对象

3.接口的成员中不能加访问修饰符,默认的为public,且不能被修改,接口中的成员不能有任何实现

4.接口和接口之间可以继承,并且可以多继承

5.接口不可以继承一个类,而类可以继承一个接口(接口只能继承类,类可以继承类和接口)

6.实现接口的子类必须实现该接口的全部成员

7.一个类可以同时继承一个类和多个接口,那么被继承类的名必须写在接口名称的前面,并用,隔开

8.显示实现接口的目的是为了解决方法的重命名问题,当继承的接口中的方法和参数一模一样时u,就要用的显示的实现接口。,当一个抽象实现接口的时候,需要子类去实现接口。

9.接口中不能包含实现的方法

时间: 2024-10-14 00:45:58

复习系列之多态的相关文章

c#复习系列之抽象方法和接口

最近一直在复习关于c#的知识点,发现里面有好多重要的内容(也是自己以前不懂的地方),特别是面向对象的部分,同时又是我们学习中的重点和难点,抽象类的接口又是多态的基础(也是实现手段),所以今天在这里对接口和抽象类做一下总结,拿出来和大家分享一下,让我们共同的教学交流与进步吧! 一 抽象类 (一)什么是抽象类和抽象方法? (1)抽象类的定义:简单的理解就是描述共性的类,抽象类中不考虑具体的实现,只是定义具有共性且必须实现的方法(也就是抽象方法),其中声明时用abstract关键字. (2)重点解释:

.Net学习笔记----2015-07-21(C#基础复习06,多态复习)

多态 1.虚方法 virtual 2.抽象类 abstract 面向对象计算器 案例: class Program { static void Main(string[] args) { //实现多态:虚方法.抽象类.接口 //简单工厂实现简单计算器效果 while (true) { Console.WriteLine("请输入第一个数字"); double n1 = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(&qu

C++系列总结——多态

前言 封装隐藏了类内部细节,通过继承加虚函数的方式,我们还可以做到隐藏类之间的差异,这就是多态(运行时多态).多态意味一个接口有多种行为,今天就来说说C++的多态是怎么实现的. 编译时多态感觉没什么好说的,编译时直接绑定了函数地址. 多态 有下面这么一段代码:A有两个虚函数(virtual关键字修饰的函数),B继承了A,还有一个参数为A*的函数foo(). #include <iostream> class A { public: A(); virtual void foo(); virtua

复习python的多态,类的内部权限调用 整理

#多态的用法 class Dii: passclass Aii(Dii): def run(self): print('一号函数已调用')class Bii(Dii): def run(Dii): print('二号函数已调用')a=Aii()print('第一个run函数调用中')a.run()b=Bii()print('第二个run函数调用中')b.run() ''' 虽然Aii和Bii中有通一个run函数,但是却不会发生python的错误,而且并成功调打印出不同函数中的print里字符串,

Java复习_4 接口多态和内部类

△abstract不可以修饰成员变量 △一个类可以没有抽象方法,可以定义为抽象类,这样的目的是不能让其他类建立本类对象,交给子类完成. △abstract和static(可以被类名调用方法,但是抽象方法调用没有意义)final(不能被覆盖方法)private(私有方法无法覆盖) △接口只能被实现.被用接口去继承或者用类或者抽象类去实现 △接口中定义的变量全部是常量.关键修饰符为Public static final.接口中没有构造方法,实现接口的类构造方法访问的是object,接口中的方法是Pu

复习系列之枚举

一 枚举的定义 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于"多项选择"场合,就是程序运行时从编译时已经设定的固定数目的"选择"中做出决定.枚举是由程序员定义的类型,与结构和类具有很强的相似性 枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法.例如,假设您必须定义一个变量,该变量的值表示一周中的一天.该变量只能存储七个有意义的值.若要定义这些值,可以使用枚举类型.枚举类型是使用 enum 关键字声明的. 默认情况下,枚举

复习系列之装箱和拆箱

一 装箱和拆箱的概念 装箱是将值类型转换为引用类型 : 拆箱是将引用类型转换为值类型 : 值类型:包括原类型(Sbyte.Byte.Short.Ushort.Int.Uint.Long.Ulong.Char.Float.Double.Bool.Decimal).枚举 (enum) .结构 (struct). 引用类型:包括类.数组.接口.委托.字符串等 我们利用代码说明一下: int n = 10; object obj = n; Console.WriteLine("装箱之前的数字为{0},装

c++复习系列

反三角函数: acos, asin, atan; c++输出控制 dec, hex, oct 设置基数为10, 16, 8; (decimal, hexadecimal, octal); setfill, setw, 填充字符, 宽度控制, 可作用于浮点数, setfill作用域为下一个数, setw作用 setprecision(x), 小数精度为x位, 和 fixed 合用可控制小数点后面有几位;作用为设置之后所有的数(如果其中没有别的控制); 语句cout << setfill('0')

java中如何实现多态

复习基础知识 多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短时间是不可能的,比如说接口,没有几年工作经验你根本不可能真正理解什么是接口,甚至有的人工作四,五年也没搞明白什么是接口,不要花太多时间去搞这些不容易搞懂的问题.重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型).重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类. 1.