2010-08-09 23 views
0

我在下面有下列情況。此代碼將爲Test2引發編譯器錯誤.net通用約束和對象繼承編譯問題

類型'InheritedChild'不能用作泛型類型或方法'panelGenericIOGrid'中的類型參數'T'。沒有從'InheritedChild'到'SerializerBase'的隱式引用轉換。

public class SerializerBase<T> 
{ 
} 
public class DirectChild : SerializerBase<DirectChild> 
{ 
} 
public class InheritedChild : DirectChild 
{ 
} 

public class panelGenericIOGrid<T> : UserControl 
    where T: SerializerBase<T>, new() 
{ 
} 

... 
panelGenericIOGrid<DirectChild> test; 
panelGenericIOGrid<InheritedChild> test2; 
... 

我相當確信我的實現是真實的錯誤。我想要以下情況,DirectChild和InheritedChild都會將它們的適當類型賦予SerializerBase構造函數。

如何讓代碼按照需要的方式工作?謝謝!

關於實際信息的一些信息。 SerializerBase有一組靜態函數,可以根據它們的類型自動序列化和反序列化自己。

DirectChild有一組將被存儲在磁盤上並被恢復的字符串。

Inhertiedchild擁有DirectChild的所有成員加上更多。

基本上我會需要DirectChild.Serialize(文件名),並IndirectChild.Serialize(文件名),其中序列化是SerializeBase

回答

1

在我看來,你缺少的接口:

public interface ISerializerBase<T> { } 
public class SerializerBase<T> : ISerializerBase<T> { } 
public class DirectChild : SerializerBase<DirectChild> { } 
public class InheritedChild : DirectChild, ISerializerBase<InheritedChild> { } 
public class panelGenericIOGrid<T> where T: ISerializerBase<T>, new() { } 

我不知道怎麼會發生變化,雖然你的設計。可能您需要重新實現InheritedChild中的一些繼承方法或一些接口方法。

但是,也許你可以做到這一點otherwise

public interface MSerializable {} 
public static class Serializable { 
    public static void Serialize(this MSerializable self, string fileName) { 
    // self will refer to the right type, 
    // no need to use generics if all you want is to serialize it ... 
    } 
} 

public class DirectChild : MSerializable { } 
public class InheritedChild : DirectChild { } 
public class panelGenericIOGrid<T> where T: MSerializable, new() { } 

你會做一個二進制序列化,還是要它序列化到XML?

+0

我認爲界面是最好的方法。它將會是一些額外的代碼,但由於BaseSerializer中的每個方法都是靜態的,所以它不需要額外的工作。謝謝! – greggorob64 2010-08-09 18:28:06

+0

如果每種方法都是靜態的,我認爲你應該真正使用mixin方法....在這種情況下繼承沒有意義,因爲你不能在接口中使用靜態方法,並且你不能使用靜態方法實現接口方法那些。 – 2010-08-09 18:30:18

2

的公衆成員的問題是,InheritedChild沒有實現SerializerBase<InheritedChild>,因此它不符合panelGenericIOGrid<T>T的限制條件。

不幸的是,解決方案的目的並不清楚,因爲我們不知道您要實現的目標。

現實生活中有哪些SerializerBase<T>的會員?如果你能給我們更多的背景,它會幫助我們幫助你。

+0

請參閱編輯,我添加了一些信息 – greggorob64 2010-08-09 18:02:03