我有基类和抽象属性。我希望所有继承类都覆盖抽象属性。例如:
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
。我无法让它发挥作用。我该怎么做才能避免这个问题?
帮助表示感谢!
答案 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 Generics
或Employee
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在她/他的答案中提供了解决方案。