在从只读接口继承属性的子类上包含setter属性



我认为这是一个重复的问题,但其他问题都略有不同。

我有一些父接口和继承类,像这样:

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#做事情的方式,一切都是属性,它增加了我觉得可能不需要的代码行。

有没有更"正确"的呢?如果我不能重写接口,或者添加字段是唯一可以做的事情,如何做到这一点?

在有人说"这个问题已经被某某人回答过了"之前。请确保它们没有引用继承了另一个接口的INTERFACE,因为这实际上是可行的。显然,这个问题只存在于具体类继承接口时。

您可以通过显式实现接口来实现您的目标。在这个例子中,我的实现使用了现有的属性(调整为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的契约,并提供了在契约(接口)中没有定义的额外功能。

最新更新