多态性 - 使用从接口而不是接口直接继承的对象

时间:2015-06-17 08:14:26

标签: c# interface polymorphism

在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个对象提交,但是,无法使用List<T>序列化T interfaceITestClass。我仍然希望list在可能的情况下指定inherit IListItem IFormatter formatter = new BinaryFormatter(); {/ 1}}。

以下是我正在使用的序列化代码:

$inputParams = array();

//fill up array

if (!empty($inputParams)) {
    $controller = new ConnectionService();
    $response = call_user_func_array(array($controller, "obtainToken"), $inputParams);
    var_dump($inputParams);
}

由于

1 个答案:

答案 0 :(得分:4)

您可以使您的界面采用泛型类型参数并将其约束为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);