C#抽象类的用法介绍
假设有2个类,一个类是主力球员,一个类是替补球员。
public class NormalPlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public decimal WeekSalary { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public decimal GetDaySalary() { return WeekSalary/7; } } public class SubPlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public decimal MonthSalary { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public decimal GetWeekSalary() { return MonthSalary/4; } }
我们发现,NormalPlayer和SubPlayer有共同的属性和方法,当然也有不同的属性和方法。把2个类的共同部分抽象出一个基类。
public class BasePlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } }
然后让先前的2个类派生于这个基类。
public class NormalPlayer: BasePlayer { public decimal WeekSalary { get; set; } public decimal GetDaySalary() { return WeekSalary/7; } } public class SubPlayer : BasePlayer { public decimal MonthSalary { get; set; } public decimal GetWeekSalary() { return MonthSalary/4; } }
接着,我们发现NormalPlayer和SubPlayer计算日薪和周薪的方法也可以抽象出来,作为虚方法放到基类中。
public class BasePlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public virtual decimal GetSalary() { throw new NotImplementedException(); } }
在NormalPlayer和SubPlayer这2个派生类中,需要重写基类的虚方法。
public class NormalPlayer: BasePlayer { public decimal WeekSalary { get; set; } //获取日薪 public override decimal GetSalary() { return WeekSalary / 7; } } public class SubPlayer : BasePlayer { public decimal MonthSalary { get; set; } //获取周薪 public override decimal GetSalary() { return MonthSalary / 4; } }
但在实际情况中,BasePlayer只是一个抽象出来的类,我们并不希望实例化这个类。这时候,就可以把BasePlayer设计为abstract抽象类。同时,在抽象类中,提供一个计算薪水的抽象方法。一旦在基类中声明了没有方法体的抽象方法,所有派生于这个抽象类的类必须实现或重写基类中的抽象方法。
public abstract class BasePlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public abstract decimal GetSalary(); }
由此可见,当2个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
相关文章
Asp.net Core中如何使用中间件来管理websocket
这篇文章主要给大家介绍了关于Asp.net Core中如何使用中间件来管理websocket的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2018-09-09.NET Core利用skiasharp文字头像生成方法教程(基于docker发布)
这篇文章主要给大家介绍了关于.NET Core利用skiasharp文字头像生成(基于docker发布)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-03-03实例解析Java中的synchronized关键字与线程安全问题
首先要清楚的是synchronized锁住的不是代码而是对象,因而在编写相关的代码块时要注意线程同步安全问题,下面就来以实例解析Java中的synchronized关键字与线程安全问题2016-06-06asp.net下模态对话框关闭之后继续执行服务器端代码的问题
asp.net下模态对话框关闭之后继续执行服务器端代码的问题...2007-04-04
最新评论