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在她/他的答案中提供了一個解決方案,如果您確實需要明確地這樣做。