多态性——使用从接口继承的对象而不是直接使用接口
Polymorphism - Using an object that inherits from an interface rather than the interface directly
在 C# class 中,是否可以使用 List<T>
,其中 T
是实现 interface
的 class,但是List<T>
是继承自 interface
的 class,而不是直接继承自 interface
?
这里有一些代码来解释:
public interface ITestClass
{
List<IListItem> list { get; set; }
}
public interface IListItem
{
//some data
}
public class ListItem : IListItem
{
//some data
}
以下代码编译正确:
public class TestClass : ITestClass
{
public List<IListItem> list { get; set; }
}
但是,以下代码无法正确编译:
public class TestClass : ITestClass
{
public List<ListItem> list { get; set; }
}
谁能解释一下为什么,我应该如何修改上面的代码?
情况脉络如下:
我想要 serialize
一个 TestClass
对象到文件,但是,它不能用 List<T>
序列化,其中 T
是一个 interface
.我仍然希望 ITestClass
指定 list
需要从 IListItem
inherit
如果可能的话。
这是我使用的序列化代码:
IFormatter formatter = new BinaryFormatter();
谢谢
您可以让您的界面采用泛型类型参数并将其限制为 IListItem
:
类型
public interface ITestClass<T> where T : IListItem
{
List<T> list { get; set; }
}
现在你的 TestClass
变成了:
public class TestClass : ITestClass<ListItem>
{
public List<ListItem> list { get; set; }
}
由于我们不知道您使用的是哪个序列化器,这里有一个 XML:
的例子
//Set up the object to serialise
var testObject = new TestClass();
testObject.list = new List<ListItem>();
testObject.list.Add(new ListItem());
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
StringWriter sw = new StringWriter();
XmlWriter writer = XmlWriter.Create(sw);
serializer.Serialize(writer, testObject);
var xml = sww.ToString();
还有另一个例子,现在您告诉我们您正在使用 BinaryFormatter
进行序列化:
var formatter = new BinaryFormatter();
var stream = new MemoryStream();
//Serialise the object to memory
formatter.Serialize(stream, testObject);
//Reset the position back to start of stream!
stream.Position = 0;
//Deserialise back into a new object
var newTestObject = (TestClass)formatter.Deserialize(stream);
在 C# class 中,是否可以使用 List<T>
,其中 T
是实现 interface
的 class,但是List<T>
是继承自 interface
的 class,而不是直接继承自 interface
?
这里有一些代码来解释:
public interface ITestClass
{
List<IListItem> list { get; set; }
}
public interface IListItem
{
//some data
}
public class ListItem : IListItem
{
//some data
}
以下代码编译正确:
public class TestClass : ITestClass
{
public List<IListItem> list { get; set; }
}
但是,以下代码无法正确编译:
public class TestClass : ITestClass
{
public List<ListItem> list { get; set; }
}
谁能解释一下为什么,我应该如何修改上面的代码?
情况脉络如下:
我想要 serialize
一个 TestClass
对象到文件,但是,它不能用 List<T>
序列化,其中 T
是一个 interface
.我仍然希望 ITestClass
指定 list
需要从 IListItem
inherit
如果可能的话。
这是我使用的序列化代码:
IFormatter formatter = new BinaryFormatter();
谢谢
您可以让您的界面采用泛型类型参数并将其限制为 IListItem
:
public interface ITestClass<T> where T : IListItem
{
List<T> list { get; set; }
}
现在你的 TestClass
变成了:
public class TestClass : ITestClass<ListItem>
{
public List<ListItem> list { get; set; }
}
由于我们不知道您使用的是哪个序列化器,这里有一个 XML:
的例子//Set up the object to serialise
var testObject = new TestClass();
testObject.list = new List<ListItem>();
testObject.list.Add(new ListItem());
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
StringWriter sw = new StringWriter();
XmlWriter writer = XmlWriter.Create(sw);
serializer.Serialize(writer, testObject);
var xml = sww.ToString();
还有另一个例子,现在您告诉我们您正在使用 BinaryFormatter
进行序列化:
var formatter = new BinaryFormatter();
var stream = new MemoryStream();
//Serialise the object to memory
formatter.Serialize(stream, testObject);
//Reset the position back to start of stream!
stream.Position = 0;
//Deserialise back into a new object
var newTestObject = (TestClass)formatter.Deserialize(stream);