2013-10-23 82 views
1

如何實現在多個子類中的超類中定義的泛型方法? 我需要正確的子類的方法來通過調用子類的實例的類型來決定:從泛型超類定義中獲取正確的子類方法

var someClassObj = new SubClass(); 
var = someClassObj.BuildList(v1, v2); 

public abstract class SomeBase 
{ 
    public List<T> BuildList<T>(int v1, int v2) 
    { 
     var results = new List<T>(); 

     for (int i = v1; i < v2; i++) 
     { 
      results.Add(AddItem<T>()); 
     } 
     return results; 
    } 

    protected abstract T AddItem<T>(); 
} 

public class SubClass : SomeBase 
{ 


    protected override BusinessThing AddItem<T>() 
    { 
     var entity = new BusinessThing(); 
     entity.Name1 = "1"; 
     entity.Name2 = "2"; 
     entity.Name3 = "3"; 
     return entity; 
    } 
} 

public class BusinessThing 
{ 
    public string Name1 { get; set; } 
    public string Name2 { get; set; } 
    public string Name3 { get; set; } 
} 

以上不建:重寫方法「T SomeBase.AddItem()」

+0

是否嘗試過一些ClassObj.BuildList (v1,v2);? – Izikon

回答

1

如果你不希望有泛型類丹尼爾建議,你也可以告訴編譯T被使用where條款限制通用類型:

public abstract class SomeBase 
{ 
    public List<T> BuildList<T>(int v1, int v2) where T: BusinessThing 
    { 
     var results = new List<T>(); 

     for (int i = v1; i < v2; i++) 
     { 
      results.Add(AddItem<T>()); 
     } 
     return results; 
    } 

    protected abstract T AddItem<T>() where T:BusinessThing; 
} 

public class SubClass : SomeBase 
{ 
    protected override T AddItem<T>() 
    { 
     var entity = new BusinessThing(); 
     entity.Name1 = "1"; 
     entity.Name2 = "2"; 
     entity.Name3 = "3"; 
     return (T)entity; 
    } 
} 

然後按如下方式使用它:

var someClassObj = new SubClass(); 
var list = someClassObj.BuildList<BusinessThing>(5, 7); 

這也可以讓你使用派生ConcreteBusinessThing類從BusinessThing派生也應使用工作:

public class SubClass : SomeBase 
{ 
    protected override T AddItem<T>() 
    { 
     var entity = new ConcreteBusinessThing(); 
     entity.Name1 = "1"; 
     entity.Name2 = "2"; 
     entity.Name3 = "3"; 
     return (T)(object)entity; // ugly cast but is always ok 
    } 
} 

和呼籲:

var someClassObj = new SubClass(); 
var list = someClassObj.BuildList<ConcreteBusinessThing>(5, 7); 
3
時無法更改返回類型

你會讓你的基類通用的,而不是它的方法:

public abstract class SomeBase<T> 
{ 
    public List<T> BuildList(int v1, int v2) 
    { 
     var results = new List<T>(); 

     for (int i = v1; i < v2; i++) 
     { 
      results.Add(AddItem()); 
     } 
     return results; 
    } 

    protected abstract T AddItem(); 
} 

public class SubClass : SomeBase<BusinessThing> 
{ 
    protected override BusinessThing AddItem() 
    { 
     var entity = new BusinessThing(); 
     entity.Name1 = "1"; 
     entity.Name2 = "2"; 
     entity.Name3 = "3"; 
     return entity; 
    } 
}