目前我已經做了一個設計,我的 BaseClass 是我的程式必須如何表現的指南。我做了一個抽象方法 DoWork() ,繼承者必須實作這個方法。
問題是 C 類覆寫了 Setup(),因此它不再需要 DoWork()。現在我只剩下一個 throw new NotImplementedException();
問題:有沒有辦法改進我的設計,這樣我就不會有那些帶有 NotImplementedException 的方法?
public abstract class BaseClass
{
public virtual void Setup()
{
DoWork();
FinnishWork();
Environment.Exit(0);
}
public abstract void DoWork();
public abstract void FinnishWork();
}
public class A : BaseClass
{
public override void DoWork()
{
Console.WriteLine('A');
}
public override void FinnishWork()
{
Console.WriteLine('FinnishA');
}
}
public class B : BaseClass
{
public override void DoWork()
{
Console.WriteLine('B');
}
public override void FinnishWork()
{
Console.WriteLine('FinnishB');
}
}
public class C : BaseClass
{
public override void Setup()
{
FinnishWork();
Console.WriteLine('C');
}
public override void DoWork()
{
throw new NotImplementedException();
}
public override void FinnishWork()
{
Console.WriteLine('FinnishC');
}
}
uj5u.com熱心網友回復:
使用從 C 類繼承的第二個基類:
public abstract class BaseBaseClass
{
public virtual void Setup()
{
FinnishWork();
Environment.Exit(0);
}
...
}
public abstract class BaseClass : BaseBaseClass
{
public abstract void DoWork();
...
}
public class C : BaseBaseClass {...}
uj5u.com熱心網友回復:
你繼承的步驟太少了。你需要BaseClassLite并且BaseClassHeavy使這項作業。
從這個開始:
public abstract class BaseClassLite
{
public virtual void Setup()
{
FinnishWork();
Environment.Exit(0);
}
public abstract void FinnishWork();
}
public abstract class BaseClassHeavy : BaseClassLite
{
public override void Setup()
{
DoWork();
base.Setup();
}
public abstract void DoWork();
}
(或者給他們更有意義的名字。)
然后你像這樣實作你的類:
public class A : BaseClassHeavy
{
public override void DoWork()
{
Console.WriteLine("A");
}
public override void FinnishWork()
{
Console.WriteLine("FinnishA");
}
}
public class B : BaseClassHeavy
{
public override void DoWork()
{
Console.WriteLine("B");
}
public override void FinnishWork()
{
Console.WriteLine("FinnishB");
}
}
public class C : BaseClassLite
{
public override void Setup()
{
base.Setup();
Console.WriteLine("C");
}
public override void FinnishWork()
{
Console.WriteLine("FinnishC");
}
}
uj5u.com熱心網友回復:
由于類 C 沒有實作DoWork()它不應該真正從你的抽象類繼承。
您只能從一個類繼承,但可以實作多個介面。在許多方面,處理介面比處理抽象類更簡單。基類,無論是否抽象,如果它們執行某些您可能希望提供給繼承類的功能,它們就會真正形成自己的。具有空方法的抽象類并不比介面好。考慮類似的事情:
public interface IDoWork
{
void DoWork();
}
public interface IBase
{
void Setup();
void FinnishWork();
}
public abstract class BaseClass : IBase, IDoWork
{
public virtual void Setup()
{
DoWork();
FinnishWork();
Environment.Exit(0);
}
public abstract void FinnishWork();
public abstract void DoWork();
}
public class A : BaseClass
{
public override void DoWork()
{
Console.WriteLine('A');
}
public override void FinnishWork()
{
Console.WriteLine("FinnishA");
}
}
public class B : BaseClass
{
public override void DoWork()
{
Console.WriteLine('B');
}
public override void FinnishWork()
{
Console.WriteLine("FinnishB");
}
}
public class C : IBase
{
public void Setup()
{
FinnishWork();
Console.WriteLine('C');
}
public void FinnishWork()
{
Console.WriteLine("FinnishC");
}
}
使用示例:
IBase instanceA = new A();
BaseClass instanceB = new B();
IBase instanceC = new C();
instanceA.Setup();
instanceB.Setup();
instanceC.Setup();
instanceB.DoWork();
uj5u.com熱心網友回復:
Setup在實作 2 個抽象方法的同時擁有一個方法的想法BaseClass很好(它甚至被命名為:模板方法模式)。
Setup()但是,如何宣告 in存在一個問題BaseClass:您這樣做virtual違反了您要強制執行的原則:
BaseClass is the guideline of how my program has to behave
現在可以覆寫它(就像您在 中所做的那樣C)并破壞您想要強制執行的行為。
virtual首先,洗掉BaseClass然后覆寫DoWork如下C:
public override void DoWork() { }
擁有這種空方法是有缺陷的抽象的標志(C真的需要繼承自BaseClass?)但如果您不提供有關這些類/方法的真正含義和名稱的更多背景關系,我將無能為力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/425682.html
