網站首頁 編程語言 正文
假設有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個或多個類中有重復部分的時候,我們可以抽象出來一個基類,如果希望這個基類不能被實例化,就可以把這個基類設計成抽象類。
原文鏈接:https://www.cnblogs.com/darrenji/p/3908618.html
相關推薦
- 2022-12-02 Jetpack?Compose自定義動畫與Animatable詳解_Android
- 2021-12-06 C語言練習之數組中素數交換_C 語言
- 2023-10-10 ant tree拖動排序 實現同級拖動 和 跨級拖動
- 2022-09-29 C#/VB.NET中從?PDF?文檔中提取所有表格_C#教程
- 2022-04-10 Pytest單元測試框架生成HTML測試報告及優化的步驟_python
- 2023-01-02 GO比較兩個對象是否相同實戰案例_Golang
- 2022-05-31 詳解python學習筆記之解釋器_python
- 2022-08-16 C#?泛型List排序的實現_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支