C#抽象类的用法介绍(c#抽象方法和虚方法的作用)不要告诉别人

随心笔谈2年前发布 admin
207 0 0

文章摘要

这篇文章讨论了如何通过基类和抽象类来统一设计多个相似类的代码结构。文章首先介绍了如何将两个不同的球员类(一个代表主力球员,一个代表替补球员)抽象为一个共同的基类`BasePlayer`,并进一步将其设计为一个抽象基类`AbstractPlayer`,以提高代码复用性。通过在基类中定义一个抽象方法`GetSalary()`,所有派生于基类的类必须实现该方法,从而避免重复代码。文章还详细说明了如何通过继承和虚方法(虚方法是指在基类中声明一个没有实现的方法)来统一处理不同球员的工资计算方式。这种设计模式能够有效地减少代码重复,提高代码的可维护性和扩展性。文章的最终目的是展示如何利用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个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文章:浅谈C# 抽象类与开闭原则C#抽象类与抽象方法详解C# 抽象类,抽象属性,抽象方法(实例讲解)基于C#的抽象类别详解C#中抽象类与接口的区别详解深入解析C#中的abstract抽象类轻松学习C#的抽象类C#抽象类和接口的区别分析C#中实现抽象类里建立静态方法c#中抽象类和接口的详细介绍

© 版权声明

相关文章