使用抽象属性继承抽象类

时间:2013-05-16 21:17:54

标签: c# override abstract-class type-inference abstract-data-type

我有基类和抽象属性。我希望所有继承类都覆盖抽象属性。例如:

public class Person
{
    public string Name{get;set;}
    public string LastName{get;set;}
}

public class Employee : Person
{
    public string WorkPhone{get;set;}
}

public abstract class MyBase
{
    public abstract Person Someone {get;set;}
}

public class TestClass : MyBase
{
    public override Employee Someone{get;set;} //this is not working
}

基类具有Person类型的Someone属性。我在Someone上覆盖TestClass属性。现在我想使用Employee类型而不是Person。我的Employee类继承自Person。我无法让它发挥作用。我该怎么做才能避免这个问题?

帮助表示感谢!

4 个答案:

答案 0 :(得分:1)

问题是您可能能够将Employee分配给Person实例,但您也不能将Person分配给Employee实例。因此,你的二传手会破裂。你要么需要摆脱setter,要么使用私有支持实例和一些看起来像的铸造(我不推荐):

public class TestClass : MyBase
{
    private Employee _employee;

    public Person Someone
    {
        get
        {
            return _employee;
        }
        set
        {
            if(!(value is Employee)) throw new ArgumentException();
            _employee = value as Employee;
        }
}

答案 1 :(得分:1)

如果您希望派生类使用ethier GenericsEmployee

,则可以使用Person

类似的东西:

public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string WorkPhone { get; set; }
}

public abstract class MyBase<T> where T : Person
{
    public abstract T Someone { get; set; }
}

public class TestClass : MyBase<Employee>
{
    public override Employee Someone { get; set; } 
}

public class TestClass2 : MyBase<Person>
{
    public override Person Someone { get; set; }
}

答案 2 :(得分:0)

这是返回类型协方差的一种形式,不幸的是在C#中不允许。

见Eric Lippert的回答here

答案 3 :(得分:0)

简而言之:每个Employee对象都是Person个对象。但并非每个Person对象都是Employee对象。

这就是编译器抱怨的原因,因为你希望它在某个地方将Employee对象视为Person对象明确要求Person - 可以是派生自 的任何对象,包括 Employee; 并非具体 Employee

注意:如果您确实需要明确地执行此操作,@ sa_ddam213在她/他的答案中提供了解决方案。