簡體   English   中英

如何實現具有IEnumerable類型的屬性的接口 <IA> 並使用實現該類型的接口的類型覆蓋?

[英]How can I implement an interface with a property of type IEnumerable<IA> and override with a type that implements the interface of the type?

是否可以執行以下或類似的操作:

public interface IDataTable
{
  IEnumerable<IColumnDefinition> Columns
}

在基類中實現該接口,如下所示:

public class DataTableBase : IDataTable
{
  public virtual IEnumerable<IColumnDefinition> Columns { get; set; }
}

然后從該基類繼承,但覆蓋或隱藏虛擬類型

public class AngularDataTable : DataTableBase
{
  public override IEnumerable<IAngularColumnDefinition> Columns { get; set; }
}

IAngularColumnDefinition實現IColumnDefinition接口,並添加了一些特定於Angular DataTable的屬性。

public interface IAngularColumnDefinition : IColumnDefinition
{
  string AdditionalProperty { get; set; }
} 

我不斷收到編譯錯誤,因為IColumnDefinition不能隱式轉換為IAngularColumnDefinition。

實現目標的最佳方法是什么? 我是否應該不只將Columns添加到基本接口和類,而是在派生類中創建和實現?

泛型呢?

public interface IDataTable
{
    IEnumerable Columns { get; set; }
}

public interface IDataTable<IColumnDef> : IDataTable
{
    IEnumerable<IColumnDef> Columns { get; set; }
}

public class DataTableBase<TColumnDef> : IDataTable<TColumnDef>
{
    public virtual IEnumerable<TColumnDef> Columns { get; set; }

    public virtual IEnumerable IDataTable.Columns
    {
         get { return this.Columns; }
         set { return this.Columns = value.Cast<TColumnDef>() } // possible problem
                       //but f.e. you can forbide setting prop for non-generic version
    }
}

public class DataTableBase :DataTableBase<IColumnDefinition> 
{
}

public class AngularDataTable : DataTableBase<IAngularColumnDefinition>
{
}

當然,這種方法幾乎沒有缺點,如果您不能執行以下任務:

DataTableBase @base = new AngularDataTable(); // compile-time error
DataTableBase<IAngularColumnDefinition> @base = new AngularDataTable(); //that's fine

如果您的函數具有兩個不同的簽名,那么override關鍵字將不起作用。

public baseClass GetSomething();

public override childClass GetSomething();

該代碼將失敗,因為GetSomething函數

您也不能只有兩個函數因返回類型而不同。 如果您不重寫基本方法,則您的孩子將獲得兩個GetSomething函數,如果您嘗試調用它們,這些函數將是模棱兩可的。

您有幾個選擇,但是沒有一個特別漂亮。 一種選擇是,您可以使AngularDataTable返回IEnumerable,並使調用該函數的代碼強制轉換您的列。

暫無
暫無

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

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