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

 更新时间:2020年06月17日 11:26:51   作者:安静点--  
这篇文章主要介绍了C# 抽象类与开闭原则的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

1.抽象类与抽象方法:

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

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

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

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

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

abstract class Vehicle
 { 
  public abstract void test();
  public void VehicleTest()
  {

  }
 }

 class Car : Vehicle
 { 
  public override void test()
  {

  }

 }

2.开闭原则

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

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

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

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方法,并且判断有什么类型:

public void Run(string type)
  {
   if (type == "Car")
   {
    Console.WriteLine("Car is running");
   }
   else if (type == "RaceCar")
   {
    Console.WriteLine("RaceCar is running");
   }
   else
   {

   }
  }

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

public virtual void Run()
  {
  
    Console.WriteLine("RaceCar is running");
   
  }

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

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# 抽象类与开闭原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#实现将pdf转文本的示例分享

    c#实现将pdf转文本的示例分享

    这篇文章主要介绍了c#实现将pdf转文本的示例,需要的朋友可以参考下
    2014-03-03
  • C#虚函数用法实例分析

    C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下
    2015-07-07
  • WinForm使用DecExpress控件中的ChartControl插件绘制图表

    WinForm使用DecExpress控件中的ChartControl插件绘制图表

    这篇文章介绍了WinForm使用DecExpress控件中的ChartControl插件绘制图表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C# 设计模式系列教程-策略模式

    C# 设计模式系列教程-策略模式

    策略模式是一种定义一系列算法的方法,从概念上来看,所有算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
    2016-06-06
  • C#图像处理之木刻效果实现方法

    C#图像处理之木刻效果实现方法

    这篇文章主要介绍了C#图像处理之木刻效果实现方法,可实现类似木刻效果的黑白照效果,需要的朋友可以参考下
    2015-04-04
  • 如何随机选取一个机器的ip

    如何随机选取一个机器的ip

    此方法可用于当需要负载均衡时,即想选择多台机器来处理程序执行。 随机的选择一台机器来处理。
    2013-03-03
  • C#获取汉字字符串拼音首字母的方法

    C#获取汉字字符串拼音首字母的方法

    这篇文章主要介绍了C#获取汉字字符串拼音首字母的方法,实例分析了C#操作汉字及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#实现折半查找算法

    C#实现折半查找算法

    这篇文章介绍了C#实现折半查找的算法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#窗口转向方式(由一个窗口,跳转到另一个窗口)

    C#窗口转向方式(由一个窗口,跳转到另一个窗口)

    这篇文章主要介绍了C#窗口转向方式(由一个窗口,跳转到另一个窗口)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C#使用HtmlAgilityPack组件解析html文档

    C#使用HtmlAgilityPack组件解析html文档

    这篇文章介绍了C#使用HtmlAgilityPack组件解析html文档的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论