C#抽象类的用法介绍

 更新时间:2022年08月26日 08:22:17   作者:Darren Ji  
这篇文章介绍了C#抽象类的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

假设有2个类,一个类是主力球员,一个类是替补球员。

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
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个类的共同部分抽象出一个基类。

1
2
3
4
5
6
7
8
9
10
11
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个类派生于这个基类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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计算日薪和周薪的方法也可以抽象出来,作为虚方法放到基类中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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个派生类中,需要重写基类的虚方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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抽象类。同时,在抽象类中,提供一个计算薪水的抽象方法。一旦在基类中声明了没有方法体的抽象方法,所有派生于这个抽象类的类必须实现或重写基类中的抽象方法。

1
2
3
4
5
6
7
8
9
10
11
12
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个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类。

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

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://www.cnblogs.com/darrenji/p/3908618.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

最新评论