2011-05-13 31 views
3

我是一個Java人,並試圖在C#中實現一些代碼。我做了一個小時的研究,但找不到任何。 我有聲明爲通用的接口稱爲如何將通用對象分配給C中的非泛型引用#

interface TypeSerializer<T> 

然後,我有兩種實現這一點。

class StringSerializer: TypeSerializer<String> 

class ByteArraySerializer: TypeSerializer<byte[]> 

現在我想創建這些實例的數組,並引用數組作爲TypeSerializer。這樣:

TypeSerializer[] serializers = 
new TypeSerializer[2] {new ByteArraySerializer(), new StringSerializer()}; 

這段代碼沒有編譯,但是在Java中有類似的代碼沒有編譯。

我也試着做某事

TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()}; 

還是沒有辦法。

我應該如何聲明這個數組並且在不知道泛型類型的情況下到達實例。

編輯

基於下面很清楚,我應該有兩個接口的答案;有和沒有通用。 這裏是接口方法。你能不能也展示如何實現它們。

public interface ITypeSerializer<T>:TypeSerializer 
{ 
    void write(BinaryWriter writer, T obj); 
    T read(BinaryReader reader); 
} 
+3

歡迎C#;-) – Steven 2011-05-13 13:08:15

+0

@Steven感謝的更美好的世界,遇到了一些麻煩,找出在這個美好的世界我的方式:) – 2011-05-13 13:43:43

回答

5

您可以創建通用版本繼承的接口的非通用版本,這會像往常一樣強制實現類。

interface ITypeSerializer { } 
interface ITypeSerializer<T> : ITypeSerializer { } 
class StringSerializer : ITypeSerializer<string> { } // implements ITypeSerializer, too 

// non-generic array 
ITypeSerializer[] serializers = ... 

,你需要在ITypeSerializer要麼接受或返回object,與實現通常是爲通用版本傳遞方法的任何方法。

一個實施的例子:

public interface ITypeSerializer 
{ 
    void Write(BinaryWriter writer, object obj); 
    object Read(BinaryReader reader); 
} 

public interface ITypeSerializer<T> : ITypeSerializer 
{ 
    void Write(BinaryWriter writer, T obj); 
    T Read(BinaryReader reader); 
} 

當你實現ITypeSerializer<T>,您還需要提供爲ITypeSerializer方法的實現。一個常見的模式是隱式地實現泛型和非泛型泛型,這樣非泛型方法僅在通過接口引用類時纔可見。

class StringSerializer : ITypeSerializer<string> 
{ 
    // implicit implementation of ITypeSerializer<string> 
    public void Write(BinaryWriter writer, string obj) 
    { 
     // provide core implementation here 
    } 

    public string Read(BinaryReader reader) 
    { 
     // provide core implementation here 
    } 

    // explicit implementation of ITypeSerializer 
    void ITypeSerializer.Write(BinaryWriter writer, object obj) 
    { 
     if (!(obj is string)) throw new ArgumentException("obj"); 

     this.Write(writer, (string)obj); 
    } 

    object ITypeSerializer.Read(BinaryReader reader) 
    { 
     return this.Read(reader); 
    } 
} 

請注意非泛型方法是簡單地傳遞給通用對象的/

+0

你也可以展示如何實現它我更新了這個問題。非常感激。 – 2011-05-13 13:38:32

+0

@Fuad,已添加示例。 – 2011-05-13 13:57:55

0

這應該做的伎倆:

interface ITypeSerializer { } 
interface ITypeSerializer<T> : ITypeSerializer { } 

請注意,這是C#約定來命名接口開始與資本I

1

如果你是不會知道的泛型類型,它不是理想的使用通用接口。我會嘗試使用:

interface ITypeSerializer {...} 

有與object工作的API。在大多數情況下,這不會造成問題 - 因爲你很可能會序列化類(所以沒有裝箱)。偶爾演員是而不是會成爲一個問題。

如果你真的想,你可以有一個雙重通用/非通用API,但除非你需要它可能是矯枉過正(說別人誰花了很多的時間與這個漂亮的,很多工作確切的場景)。

2

你的接口可以聲明如下:

interface TypeSerializer<out T> 

的「OUT」讓您使用的C#泛型方差的特徵,你就可以編譯你嘗試第二種形式:

TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()}; 

這將工作在C#4.0和更高版本

+0

我正在使用單聲道,所以這不起作用? 沒有編譯。有沒有我應該使用的命名空間? – 2011-05-13 13:22:41

+0

嗯,不知道那個。我認爲Mono對C#4.0功能有一些支持,但不能特別說明是否有這個功能。 – jlew 2011-05-13 13:29:26

相關問題