C#中易混淆概念:抽象类,抽象方法

在介绍抽象类和抽象方法之前还是先提一下多态的基本概念。

其实在上一篇关于里氏替换原则就已经说明了多态的精髓“子类对象可以替换父类对象的位置,而程序的功能不受影响”。还是来看一段代码吧:

子类的代码如下:

下面需要一个实现多态的类,代码如下:

主体代码和实现多态的方法如下:

运行,打印结果如下:

1

这里可以发现,我们outputFeature方法根据传入的实体对象不同(父类变量指向了子类的对象),而打印出了不同人物的特点,这就是多态。

代码图解如下:

2

多态总结如下:

3

二,抽象类和抽象方法

在C#中使用abstract关键字修饰的类和方法,叫做抽象类和抽象方法。

1)抽象类中可以拥有没抽象成员,为了继承给他的子类调用 (抽象类就是为了定义抽象成员,继承给子类去实现,同时子类也可以调用父类的非抽象成员)

2)抽象类中可以有virtual修饰的虚方法

如上面的代码,在抽象类中定义了virtual修饰的方法,编译通过。抽象类就是为了定义抽象成员,继承给子类去实现,所以子类也可以实现抽象类中的虚方法。

3)抽象类不能实例化,因为有抽象成员,而抽象成员没有方法体,如下图,

4

4)抽象成员不能私有,如果私有子类没有办法访问 

我们可以在抽象类中定义私有成员,但是没有意义。因为子类根本访问不到这些私有成员,而抽象类本身也不能实例化,所以私有成员访问不到。

5)子类必须重写父类的抽象方法 

在上面代码的基础上,我们定义一个Student类,继承抽象类,但是不实现抽象类的抽象方法,编译报错。代码如下:

5

6)在子类中没有办法通过base关键字调用父类抽象方法 

原理同上,抽象类的抽象发放没有实现语句,就算调用也没有意义。但是可以使用base关键字调用非抽象方法,代码如下:

打印结果如下:

6

抽象类思维导图总结如下:

7

抽象方法

1)抽象方法必须定义在抽象类中,

代码编译会报错,如下图:

8

2)抽象方法必须使用关键字修饰,示例代码如下:

抽象方法思维导图总结如下:

9

 那么什么时候使用抽象类呢?

①子类必须重写父类的方法(相当于定义了一个标准,规范)

②父类没有必要实例化,就用抽象类

③抽象类是为了继承,为了多态

最后来看一个示例代码:

定义一个抽象类,其中包含抽象方法Run()

分别定义两个子类,继承抽象类Person

为了表现多态,我们编写一个方法如下:

main函数中的代码如下:

运行,分别输入“工人”和“学生”的打印结果如下:

10

 

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部