首页 > 解决方案 > 在从只读接口继承属性的子类上包括 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# 中做事的“正确”方式,因为一切都是属性,并且它添加了我认为可能不需要的代码行。

那么如果我不能重写界面,或者添加一个字段是唯一可以做的事情,是否有更“正确”的方法来做到这一点?

在有人说“这个问题之前已经被某某回答过”之前,请确保他们不是指继承另一个接口的接口,而这实际上确实有效。显然,这个问题只存在于具体类继承接口时。

标签: c#inheritanceinterfacepropertiesreadonly

解决方案


您可以通过显式实现接口来实现您的目标。在此示例中,我的实现利用了现有属性(调整为 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并提供合同(接口)中未定义的附加功能。


推荐阅读