4

我有以下代码:

public class BaseClass
{
    public string A { get; set; }
}

public class DerivedClass : BaseClass
{
    public string B { get; set; }
}


List<DerivedClass> _derivedClass = new List<DerivedClass>() 
                                       { 
                                           new DerivedClass() 
                                             { A = "test1",
                                               B = "test2"
                                             }
                                       }; 

List<BaseClass> _baseClass = _derivedClass.Cast<BaseClass>.ToList();

代码编译没有任何错误,但是,我希望_baseClass只包含属性A(类型的对象BaseClass),但它同时返回AB属性(类型的对象DerivedClass)。我缺少什么以及将派生类列表转换为其基类列表的正确方法是什么?

谢谢你。

4

1 回答 1

12

我缺少什么以及将派生类列表转换为其基类列表的正确方法是什么?

该列表仍然包含 的实例DerivedClass,但它们被用作对 的引用BaseClass

但是,此 API 的任何使用者都不会知道这一点,因此他们会将其视为BaseClass元素。

这是常见的,通常是正确的方法。如果您需要将实例实际转换BaseClass实例(这可能不是必需的),则需要实际BaseClassDerivedClass成员中创建新实例,即:

List<BaseClass> _baseClass = _derivedClass.Select(dc => new BaseClass {A = dc.A}).ToList();

这通常不是必需的,您当前的方法可能很好。Liskov 替换原则指出 any应该在任何情况下DerivedClass都可以用作 a BaseClass,这意味着只需像您一样返回列表就可以了。

于 2013-02-11T17:21:29.213 回答