我是一个Java人,并试图在C#中实现一些代码.我做了一个小时的研究,但找不到任何.我有一个我声明为Generic的接口
interface TypeSerializer<T>
Run Code Online (Sandbox Code Playgroud)
然后我有两个这样的实现.
class StringSerializer: TypeSerializer<String>
Run Code Online (Sandbox Code Playgroud)
和
class ByteArraySerializer: TypeSerializer<byte[]>
Run Code Online (Sandbox Code Playgroud)
现在我想用这些实例创建一个数组,并将数组称为TypeSerializer.是这样的:
TypeSerializer[] serializers =
new TypeSerializer[2] {new ByteArraySerializer(), new StringSerializer()};
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,但在Java中,类似的代码会编译.
我也试过了......
TypeSerializer<Object>[] serializers =
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()};
Run Code Online (Sandbox Code Playgroud)
仍然没办法.
如何在不知道通用类型的情况下声明此数组并到达实例.
编辑
基于下面的答案,很明显我应该有两个接口; 有和没有通用.这是接口方法.你能否告诉我们如何实施它们.
public interface ITypeSerializer<T>:TypeSerializer
{
void write(BinaryWriter writer, T obj);
T read(BinaryReader reader);
}
Run Code Online (Sandbox Code Playgroud)
您可以创建泛型版继承的接口的非泛型版本,这会像往常一样强制实现类.
interface ITypeSerializer { }
interface ITypeSerializer<T> : ITypeSerializer { }
class StringSerializer : ITypeSerializer<string> { } // implements ITypeSerializer, too
// non-generic array
ITypeSerializer[] serializers = ...
Run Code Online (Sandbox Code Playgroud)
您需要的任何方法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);
}
Run Code Online (Sandbox Code Playgroud)
实现时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);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意非泛型方法是如何简单地传递给通用对应方的.