![](/img/trans.png)
[英]How can I implement a factory to return a type that implements a generic interface, without knowing the generic type ahead of time?
[英]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.