C#面向对象(三):多态

2021-05-15 12:50

阅读:396

前文链接:

C#面向对象(一):明确几个简单的概念作为开胃菜

C#面向对象(二):封装和继承

今天来聊聊面向对象的多态,这部分算是比较重要和核心的,很多工作2年多的程序员其实对于面向对象和多态的理解也是不到位的,这次好好总结下,理顺思路。

三、多态:

  有多态之前必须要有继承,只有多个类同时继承了同一个类,才有多态这样的说法。

  在继承关系的前提下,实例化出不同的对象,这些对象调用相同的方法,但是却表现出不同的行为,这就叫做多态。

  在 C#语言中体现多态有三种方式:虚方法,抽象类, 接口

1、虚方法语法

1.1什么是虚方法?

在父类中使用 virtual 关键字修饰的方法, 就是虚方法。在子类中可以使用 override 关键字对该虚方法进行重写。

Virtual方法也可以单独执行。

1.2虚方法语法

父类:

public virtual 返回值类型 方法名()

{

方法体代码;

}

子类:

public override 返回值类型 方法名()

{

方法体代码;

}

例:老虎和猫继承同一个父类,实现“ 叫”虚方法

    class CatType
    {
        public virtual void Cry()
        {
            Console.WriteLine("深呼吸,张开嘴巴,开始:");
        }
    }

class Cat:CatType { public override void Cry() { base.Cry(); Console.WriteLine("喵喵喵"); } }

class Tiger:CatType { public override void Cry() { base.Cry(); Console.WriteLine("咆哮"); } }

1.3.虚方法使用细节

①将父类的方法标记为虚方法, 就是在父类方法的返回值前加 virtual 关键字,表示这个方法可以被子类重写。

②子类重写父类方法, 在子类的方法的返回值前加 override 关键字。

③父类中的虚方法, 子类可以重写, 也可以不重写。

④父类中用 virtual 修饰的方法, 可以用于实现该方法共有的功能(比如初始化该方法), 然后在子类重写该方法时, 使用 base 关键字调用父类中的该方法。

2、多态之里氏转换原则

2.1面向对象六大原则

在使用面向对象思想进行程序设计开发过程中, 有六大原则需要注意, 六大原则在面向对象编程中的地位类似于“ 马列主义” “ 毛XX思想” “ 邓小平理论” 等,作为编程的“ 指导思想” 和“ 行动指南” 存在的。

六大原则如下:

①单一职责原则; ②开闭原则; ③里氏转换原则;

④依赖倒置原则; ⑤接口隔离原则; ⑥迪米特原则;

这六大面向对象编程原则, 在后续中我们会一一介绍到, 本节课讲解第一个原则: 里氏转换原则!先定义一个子类,重写cry方法,增加monkey方法

    class Cat:CatType
    {
        public override void Cry()
        {
            base.Cry();
            Console.WriteLine("喵喵喵");
        }
        public void Monkey()
        {
            Console.WriteLine("我是子类--Cat类");
        }
    }

2.2何为里氏转换

①子类对象可以直接赋值给父类变量;

技术分享图片

而且父类的变量cry方法也被重写了(override)。

②子类对象可以调用父类中的成员, 但是父类对象永远只能调用自己的成员;

CatType无法调用monkey();

③如果父类对象中装的是子类对象, 可以将这个父类对象强转为子类对象;

            //现在方式.

            CatType ct = new Cat();

            ct.Cry();

            ct.MKCODE();

目前ct虽然是子类对象,但是装在父类中,所以无法调用子类的monkey方法,强制转化之后,就可以使用monkey方法了

            Cat c2 = (Cat)ct;

            c2.Monkey();

这里我们用的是强制类型转换

也可以使用is as 转换

is as 两个关键字都可以进行类型转换。

is: 如果转换成功, 返回 true, 失败返回 false

as: 如果转换成功, 返回对应的对象, 失败返回 null

            bool mk = ct is Tiger;

            Console.WriteLine(mk);

 

if(ct as Cat == null)

            {

                Console.WriteLine("转换失败");

            }else{

                Console.WriteLine("转换成功");

            }

 


评论


亲,登录后才可以留言!