認為這是一個重復的問題,但其他問題都略有不同。
我有一些父介面和這樣的繼承類:
public interface IPerson
{
IPersonData PersonData {get;}
//other stuff
}
public interface IPersonData
{
public String Name {get;}
//other stuff
}
public class Person : IPerson
{//need to implement IPersonData
IPersonData PersonData {get;set;} = new PersonData();
//other stuff
PersonData.Name = "JohnDoe";//compiler error somewhere in a method
}
public class PersonData : IPersonData
{//need to implement IPersondata
public String Name {get;set;}
//other stuff
}
因此,正如您所看到的,我的目標是實作IPerson介面,同時還能夠寫入 IPersonData 的 Name 屬性(實體化為 PersonData)。由于代碼寫在這里,如果我嘗試執行 PersonData.Name = "JohnDoe" 編譯器將拋出錯誤,因為該屬性顯然是只讀的。如果我嘗試將 IPersonData 更改為 PersonData pd = New PersonData,那么我顯然不再實作介面要求。
我必須這樣做,因為這些是必需的介面,不是由我撰寫或控制的。最初撰寫這些介面時,它們可能沒有自動欄位屬性。
我所知道的是,我可以在其后面實作一個欄位,并在需要寫入時讓程式寫入該欄位,并且該屬性可以參考該欄位。但是,我覺得這可能不是 2021 年在 c# 中做事情的“正確”方式,其中一切都是屬性,并且它添加了我認為可能不需要的代碼行。
那么,如果我不能重寫介面,或者添加一個欄位是唯一可以做的事情,那么有沒有更“正確”的方法來做到這一點?
在有人說“這個問題之前已經被某某回答過”之前,請確保他們不是指繼承另一個介面的介面,而該介面實際上確實有效。顯然,這個問題只存在于具體類繼承介面時。
uj5u.com熱心網友回復:
您可以通過顯式實作介面來實作您的目標。在這個例子中,我的實作利用了現有的屬性(調整為 type PersonData):
public class Person : IPerson
{//need to implement IPersonData
public PersonData PersonData { get; set; } = new PersonData();
IPersonData IPerson.PersonData => PersonData;
//other stuff
}
編碼
Person fred = new Person();
fred.PersonData.Name = "Fred";
Console.WriteLine(fred.PersonData.Name);
產出
弗雷德
該類現在履行合同IPerson并提供合同(介面)中未定義的附加功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/345013.html
