簡體   English   中英

從抽象類和接口繼承的問題是否存在,其中抽象從基本接口繼承

[英]Are there any issue inheriting from an abstract class and interface where the abstract inherits from base interface

從抽象類和接口繼承的問題是否存在,其中抽象從基本接口繼承。 下面的示例僅是為了說明概念而進行了精簡。 我這樣做是為了創建一個基於IFooRepository的偽類,並且FooRepository可以重用我的抽象類中的所有代碼(這些代碼將由許多其他類共享):

public interface IMyRepository<T> where T : class
{
    List<T> GetEntity();
}

public abstract class MyRepository<T> : IMyRepository<T> where T : class
{
    protected readonly string _connectionString;

    public virtual T CommonFunction(int Id)
    {
        //do my common code here
    }

    public List<T> GetEntity()
    {
    }

}

public interface IFooRepository : IMyRepository<Foo>
{
    void UpdateFoo(int id, string foo);
}


public class FooRepository : MyRepository<Foo>, IFooRepository
{
    public void UpdateFoo(int id, string foo)
    {
        throw new NotImplementedException();
    }
}

public class FakeFooRepository :  IFooRepository
{
    public List<Foo> GetEntity()
    {
        throw new NotImplementedException();
    }

    public void UpdateFoo(int id, string foo)
    {
        throw new NotImplementedException();
    }
}

public interface IBarRepository : IMyRepository<Bar>
{
    void DoSomethingElse(int id);
}

public class BarRepository : MyRepository<Bar>, IBarRepository
{
    public void DoSomethingElse(int id)
    {

    }
}

如果IFooRepository不繼承自IMyRepository,而是包含所有像這樣的成員,那就更好了:

public interface IFooRepository
{
    void UpdateFoo(int id, string foo);
    List<Foo> GetEntity();
}

無論哪種方式,整個過程都可以按我預期的方式編譯和運行,只是想知道由於接口重疊而引起的問題。

謝謝

您無需在具體類中實現接口,如果您的基類實現了某些接口,則其所有子級將自動成為該接口的實現者

您的第一個示例看起來非常合理。 IFooRepository繼承自IMyRepository,因為該接口本質上是類型為Foo的IMyRepository。 出於同樣的原因,您的第二個樣本(其中IFooRepository不繼承自IMyRepository)肯定似乎破壞了您嘗試建立的關系。 聽起來這不是一個好計划。

通常,您可能會考慮這樣做的另一種方法是使Foo和Bar(和T)都具有相同的類型(IRepositable或其他類型),並且特定於Foo或Bar的行為在其IRepositable的單獨實現中表示。 如果可以通過保持Foo和Bar正確封裝的方式來完成此操作,那么您將得到一個非常優雅的解決方案。

如果Foo需要執行UpdateFoo和Bar,類似地,需要使用相同的方法簽名來執行UpdateBar,以此類推,對於其他任何IRepositable來說都是如此。 但是在您的情況下,方法名稱DoSomethingElse似乎表明IBarRepository正在實現與UpdateFoo方法完全不同的行為。 如果是這樣,那么您是正確的。 從特定類型的IMyRepository繼承的接口可能是最好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM