服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 浅谈C# 抽象类与开闭原则

浅谈C# 抽象类与开闭原则

2022-09-15 17:44安静点-- C#

这篇文章主要介绍了C# 抽象类与开闭原则的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

1.抽象类与抽象方法:

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
abstract class Vehicle
 {
  public abstract void test();
  public void VehicleTest()
  {
 
  }
 }
 
 class Car : Vehicle
 {
  public override void test()
  {
 
  }
 
 }

2.开闭原则

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Program
 {
  static void Main(string[] args)
  {
   Vehicle raceCar = new RaceCar();
   
   Console.ReadKey();
  }
 }
 
 /// <summary>
 /// 交通工具类
 /// </summary>
 class Vehicle
 {
  /// <summary>
  /// 停车
  /// </summary>
  public void Stop()
  {
   Console.WriteLine("Stopped");
  }
  /// <summary>
  /// 加油
  /// </summary>
  public void Fill()
  {
   Console.WriteLine("Fill");
  }
 }
 
 class Car : Vehicle
 {
  public void Run()
  {
   Console.WriteLine("Car is running");
  }
 }
 class RaceCar : Car
 {
  public void Run()
  {
   Console.WriteLine("RaceCar is running");
 
  }
 }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void Run(string type)
  {
   if (type == "Car")
   {
    Console.WriteLine("Car is running");
   }
   else if (type == "RaceCar")
   {
    Console.WriteLine("RaceCar is running");
   }
   else
   {
 
   }
  }

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

?
1
2
3
4
5
6
public virtual void Run()
  {
  
    Console.WriteLine("RaceCar is running");
   
  }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Program
 {
  static void Main(string[] args)
  {
   Vehicle raceCar = new RaceCar();
 
   Console.ReadKey();
  }
 }
 
 /// <summary>
 /// 交通工具类
 /// </summary>
 abstract class Vehicle
 {
  /// <summary>
  /// 停车
  /// </summary>
  public void Stop()
  {
   Console.WriteLine("Stopped");
  }
  /// <summary>
  /// 加油
  /// </summary>
  public void Fill()
  {
   Console.WriteLine("Fill");
  }
  public abstractvoid Run()
  {
  
    Console.WriteLine("RaceCar is running");
   
  }
 }
 
 class Car : Vehicle
 {
  public override void Run()
  {
   Console.WriteLine("Car is running");
  }
 }
 class RaceCar : Car
 {
  public override void Run()
  {
   Console.WriteLine("RaceCar is running");
 
  }
 }

4.接口与抽象类

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

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

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

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

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

到此这篇关于浅谈C# 抽象类与开闭原则的文章就介绍到这了,更多相关C# 抽象类与开闭原则内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/anjingdian/p/13138430.html

延伸 · 阅读

精彩推荐
  • C#C#操作图片读取和存储SQLserver实现代码

    C#操作图片读取和存储SQLserver实现代码

    用C#将Image转换成byte[]并插入数据库/将图片数据从SQLserver中取出来并显示到pictureBox控件上,接下来将为你详细介绍下实现步骤,感兴趣的你可以参考下...

    C#教程网2882020-12-18
  • C#Unity3D实现鼠标控制视角转动

    Unity3D实现鼠标控制视角转动

    这篇文章主要为大家详细介绍了Unity3D实现鼠标控制视角转动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    JeterPong10682022-07-06
  • C#C#登入实例

    C#登入实例

    本篇文章通过截图的方式向大家展示C#程序登陆实现的全过程,利用了C#三层架构的编写方法,希望对大家今后编写代码有所帮助...

    sctnl5842021-12-10
  • C#C#中如何利用正则表达式判断字符

    C#中如何利用正则表达式判断字符

    这篇文章主要介绍了C#中利用正则表达式判断字符的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    C#教程网4352021-12-15
  • C#C# 创建、部署和调用WebService简单示例

    C# 创建、部署和调用WebService简单示例

    这篇文章主要为大家详细介绍了C# 创建、部署和调用WebService的简单示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Brambling5002022-01-04
  • C#C#连接数据库的方法

    C#连接数据库的方法

    ASP.NET连接数据库的技术叫ADO.NET,它是用来向数据库提交sql语句的一堆类。这里连接的是Sql Server 2008数据库,其他数据库用法差不多,就是调用的类名不一...

    C#教程网7692021-11-01
  • C#C#线程队列用法实例分析

    C#线程队列用法实例分析

    这篇文章主要介绍了C#线程队列用法,以实例形式分析了C#线程队列的创建、运行、等待、结束等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧6542021-10-24
  • C#详解C# Socket简单例子(服务器与客户端通信)

    详解C# Socket简单例子(服务器与客户端通信)

    这篇文章主要介绍了详解C# Socket简单例子(服务器与客户端通信) ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。...

    Andrew_wx11412021-12-13