我有一個抽象類BaseClass和擴展類Class1 Class2 Class3 Class...
所有類都有版本概念。
上課提示是這個
internal abstract class BaseClass
{
internal abstract bool MethodA();
internal abstract bool MethodB();
...
}
// you can imagine Class1 is version 1
internal class Class1 : BaseClass
{
internal override bool MethodA() => ...; // do something belong Class1 version logic
internal override bool MethodB() => ...; // do something belong Class1 version logic
...
}
現在,我有一個問題。
當我想將我的業務邏輯升級到版本 2 時,內部邏輯是一樣的。
使用繼承可能不是一個好主意嗎?
// you can imagine Class2 is version 2
internal class Class2 : Class1
{
// the MethodA is the same with Class1, so the place didn't override
internal override bool MethodB() => ...; // new logic different than Class1.MethodB
...
}
有這個問題是因為我想在 n 年后。這個類有可能升級到版本n,這樣繼承會很深。
// ex:
Class3 : Class2;
Class4 : Class3;
Class5 : Class4;
...
或者任何人有解決版本問題的想法?(同樣,每次迭代有 90% 相同和 10% 不同)
謝謝!
uj5u.com熱心網友回復:
讓我們退后一步,以最直接的方式實施:
public class Class1 : BaseClass
{
public void MethodA() {...}
public void MethodB() {...}
}
public class Class2 : BaseClass
{
public void MethodA() {/* same as in Class1 */}
public void MethodB() {...}
}
現在你想避免這種代碼重復。
所以我建議朝著組合的方向前進,并將 Class2 定義為 Class1 的包裝器,并向外繼續這種方法:
public class Class2 : BaseClass
{
private readonly BaseClass prevVersionClass;
public Class2(BaseClass prevVersionClass)
{
this.prevVersionClass = prevVersionClass;
}
public void MethodA() { prevVersionClass.MethodA(); }
public void MethodB() {...}
}
uj5u.com熱心網友回復:
我認為您可以簡單地更喜歡組合而不是繼承,并使用適當的設計模式進行版本控制。
如果你想堅持繼承,那很好。代碼重復不能存在,您可以執行以下操作:
- 創建派生類將繼承但不會覆寫的新函式。
- 使用 Open-Closed 原則(SOLID 的一部分),讓客戶端通過委托傳遞邏輯。
- 進一步分離關注點并在您關注的相關類中使用依賴注入可能有重復的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513886.html
標籤:C#。网
上一篇:介面變數宣告
