Csharp/C#教程:浅谈C# 抽象类与开闭原则分享

1.抽象类与抽象方法:

(1)使用关键字abstract修饰的类,称为抽象类.

(2)抽象类只是用到一个类所具有的行为,不能单独通过创建对象来使用.使用new是错误的.可以通过派生类来实现其函数成员的具体逻辑。

(3)抽象类中可以有抽象方法,也可以没有任何抽象方法.只要类中存在一个抽象方法,这个类就是抽象类。

(4)抽象类不能是静态的(static)或者密封的(sealed)

下面就是一个简单的抽象类

abstractclassVehicle { publicabstractvoidtest(); publicvoidVehicleTest() { } } classCar:Vehicle { publicoverridevoidtest() { } }

2.开闭原则

 如果不是为了修改bug,或者是添加新的功能,不要随便更改类的代码。

换句话说,我们应该封装那些确定的,不变的,稳定的,固定的。把不确定的,有可能会改变的成员声明为抽象类,留给子类去实现。

3.我们简单实现了一个继承

classProgram { staticvoidMain(string[]args) { VehicleraceCar=newRaceCar(); Console.ReadKey(); } } ///<summary> ///交通工具类 ///</summary> classVehicle { ///<summary> ///停车 ///</summary> publicvoidStop() { Console.WriteLine("Stopped"); } ///<summary> ///加油 ///</summary> publicvoidFill() { Console.WriteLine("Fill"); } } classCar:Vehicle { publicvoidRun() { Console.WriteLine("Carisrunning"); } } classRaceCar:Car { publicvoidRun() { Console.WriteLine("RaceCarisrunning"); } }

从上面的代码我们可以看出这是一个继承链,其中Run方法是根据不同种类的车来区别的,所以我们如果想实现多态,比如   VehicleraceCar=newRaceCar();此时raceCar对象是调不到Run方法的,因为Vehicle类中没有这个方法,以前对于这种情况的解决方法是在Vehicle中加上Run方法,并且判断有什么类型:

publicvoidRun(stringtype) { if(type=="Car") { Console.WriteLine("Carisrunning"); } elseif(type=="RaceCar") { Console.WriteLine("RaceCarisrunning"); } else { } }

如上代码,这样的话,当增加新类型的时候还要再改这个基类中的方法,违反了开闭原则(如果不是为了修改bug,或者是添加新的功能,不要随便更改类的代码),所以需要做一下修改:

publicvirtualvoidRun() { Console.WriteLine("RaceCarisrunning"); }

派生类来重写这个方法,这样增加新类型的时候重写就可以,就不用再更改基类的代码了。但是,如果你觉得这个类中基本不会调用这个Run方法,那我们可以去掉方法体,改成抽象方法,相应的类也变成抽象类,Run完全由派生类来重写。

classProgram { staticvoidMain(string[]args) { VehicleraceCar=newRaceCar(); Console.ReadKey(); } } ///<summary> ///交通工具类 ///</summary> abstractclassVehicle { ///<summary> ///停车 ///</summary> publicvoidStop() { Console.WriteLine("Stopped"); } ///<summary> ///加油 ///</summary> publicvoidFill() { Console.WriteLine("Fill"); } publicabstractvoidRun() { Console.WriteLine("RaceCarisrunning"); } } classCar:Vehicle { publicoverridevoidRun() { Console.WriteLine("Carisrunning"); } } classRaceCar:Car { publicoverridevoidRun() { Console.WriteLine("RaceCarisrunning"); } }

4.接口与抽象类

(1)具体类-》抽象类-》接口,越来越抽象,内部实现的类越来越少。

(2)抽象类为复用而生:专门作为基类来使用,也具有解耦功能。

(3)封装确定,开放不确定的,推迟到子类实现。

(4)接口为解耦而生,高内聚,低耦合,方便单元测试。

(5)都不能实例化,只能声明变量,引用具体类的实例。

到此这篇关于浅谈C#抽象类与开闭原则的文章就介绍到这了,更多相关C#抽象类与开闭原则内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

您可能感兴趣的文章:C#抽象类与抽象方法详解C#抽象类,抽象属性,抽象方法(实例讲解)基于C#的抽象类别详解深入解析C#中的abstract抽象类C#抽象类和接口的区别分析

标签: 抽象类 抽象 开闭原则

解决python pandas读取excel中多个不同sheet表格存在的问题

Nginx/Httpd反代tomcat配置教程

上述就是C#学习教程:浅谈C# 抽象类与开闭原则分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/903787.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐