2

我有具有抽象属性的基类。我想要所有的继承类来覆盖抽象属性。例如:继承具有抽象属性的抽象类

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类型。我在TestClass上压倒Someone财产。现在我想使用Employee类型而不是Person。我的Employee类继承自Person。我无法让它工作。我应该怎么做才能避免这个问题?

帮助感谢!

+0

你永远不会实现Person Person,而Employee Employee不在基类MyBase中。 – Matthew

+0

[c#covariant返回类型利用泛型]的可能重复(http://stackoverflow.com/questions/4348760/c-sharp-covariant-return-types-utilizing-generics) – nawfal

回答

1

问题是,您可能能够将一个员工分配给某个人员实例,但您也不能将一个员工分配给员工实例。因此,你的二传手会打破。你要么需要摆脱二传手的,或者使用专用的后盾实例和一些铸造(我不推荐),它看起来像:

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; 
     } 
} 
+0

感谢您的解释! – Dilshod

+0

我最终也实施了这种方法,但我不喜欢它。鉴于我不能放弃二传手,那么你推荐什么?或者OP和我自己使用这种模式是错误的? – propagated

0

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

查看Eric Lippert的回答here

1

你可以使用Generics如果你想派生类使用西尔EmployeePerson

喜欢的东西:

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; } 
} 
0

总之:每个Employee对象是Person对象。但不是每个Person对象都是Employee对象。

这就是为什么编译器抱怨,因为你希望它来治疗Employee对象在某些地方一个Person对象,一个Person明确要求 - 这可以是包括Employee从人派生的任何对象; 不是专门的Employee

注意:@ sa_ddam213在她/他的答案中提供了一个解决方案,如果您确实需要明确地这样做。