2012-10-02 159 views
0

MasterClass在工作類型集合類的基類,從這個Attachvariable繼承。 Table存儲MasterClass對象。繼承基類的集合

public class Table 
{ 
    private Dictionary<int, MasterClass> map = new Dictionary<int, MasterClass>(); 

    public bool isInMemory(int id) 
    { 
     if (map.ContainsKey(id)) 
      return true; 
     return false; 
    } 

    public void doStuffAndAdd(MasterClass theclass) 
    { 
     theclass.setSomething("lalala"); 
     theclass.doSomething(); 
     map[theclass.id] = theclass; 
    } 

    public MasterClass getIt(int id) 
    { 
     return map[id]; 
    } 
} 

所以,現在出現這種情況:

Table table = new Table(); 
if (!table.isInMemory(22)) 
{ 
    Attachvariable attachtest = new Attachvariable(22); 
    table.doStuffAndAdd(attachtest); 
    Console.WriteLine(attachtest.get_position()); //Get_position is a function in Attachvariable 
} 
else 
{ 
    Attachvariable attachtest = table.getIt(22); //Error: Can't convert MasterClass to Attachvariable 
    Console.WriteLine(attachtest.get_position()); 
} 

有什麼辦法使之與從MasterClass繼承任何類Table工作,不知道有關這個類的實存了前面,這樣我還是可以使用doStuffAndAdd(MasterClass theclass)並且還使用Attachvariable作爲getIt()的返回類型。

我不能使用Table<T>因爲那時doStuffAndAdd不能大師班對象添加到字典中。沒有辦法檢查T是否繼承了MasterClass,所以這並不令人驚訝......我該怎麼做這項工作?

public class Table<T> 
{ 
    private Dictionary<int, T> map = new Dictionary<int, T>(); 

    public bool isInMemory(int id) 
    { 
     if (map.ContainsKey(id)) 
      return true; 
     return false; 
    } 

    public void doStuffAndAdd(MasterClass theclass) 
    { 
     theclass.setSomething("lalala"); 
     theclass.doSomething(); 
     map[theclass.id] = theclass; //Error: can't convert MasterClass to T 
    } 

    public T getIt(int id) 
    { 
     return map[id]; 
    } 
} 
+0

如果您做些什麼' Attachvariable attachtest = new MasterClass(22);'代替? – MyCodeSucks

+0

@KevinH。不,那不會編譯。 –

回答

1

我相信這一點:

public void doStuffAndAdd(MasterClass theclass) 
    { 
     theclass.setSomething("lalala"); 
     theclass.doSomething(); 
     map[theclass.id] = theclass; //Error: can't convert MasterClass to T 
    } 

必須

public void doStuffAndAdd(T theclass) 
    { 
     theclass.setSomething("lalala"); 
     theclass.doSomething(); 
     map[theclass.id] = theclass; //should work 
    } 

您可以檢查如果一個類繼承了另一個這樣做:

if(theclass is MasterClass) 
{} 
+0

問題是,現在我不能使用MasterClass.setSomething()函數等,因爲T沒有它們。 – natli

+3

需要把約束上'T'類聲明:'公共類表其中T:MasterClass' –

+0

添加約束至T獲得該功能@natli –