多态性 - 使用从接口而不是直接继承接口的对象
本文关键字:接口 继承 对象 多态性 | 更新日期: 2023-09-27 17:56:36
在C#类中,是否可以使用List<T>
,其中T
是实现interface
的类,但List<T>
是从interface
继承的类,而不是直接从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
对象到文件,但是,它不能用T
是interface
的List<T>
进行序列化。我仍然希望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);