包括从只读接口继承 属性 的子 class 上的 setter 属性
Including setter property on child class that inherited the property from a read-only interface
以为这是一个重复的问题,但其他问题都略有不同。
我有一些父接口并像这样继承 classes:
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(实例化为 PersonData)的名称 属性。正如此处编写的代码,如果我尝试执行 PersonData.Name = "JohnDoe" 编译器将抛出错误,因为 属性 显然是只读的。如果我尝试将 IPersonData 更改为 PersonData pd = New PersonData,那么我显然不再实现接口要求。
我必须这样做,因为这些是必需的接口,不是由我编写或控制的。当最初编写这些接口时,它们是在它们可能没有自动字段属性的时候完成的。
我所知道的是我可以在它后面实现一个字段,当我需要写的时候让程序写入这个字段,属性可以引用这个字段。但是,我觉得这可能不是 2021 年在 c# 中做事的“正确”方式,因为一切都是 属性 并且它添加了我认为可能不需要的代码行。
如果我不能重写界面,或者添加字段是唯一可以做的事情,那么有没有更“正确”的方法来做到这一点?
在有人说“这个问题之前已经被某某某某回答过”之前,请确保他们指的不是继承另一个接口的接口,而该接口确实有效。显然,这个问题仅在具体 class 继承接口时才存在。
您可以通过显式实现接口来实现您的目标。在此示例中,我的实现使用了现有的 属性(调整为类型 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);
产出
Fred
class 现在履行 IPerson
的合同并提供合同(接口)中未定义的附加功能。
以为这是一个重复的问题,但其他问题都略有不同。
我有一些父接口并像这样继承 classes:
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(实例化为 PersonData)的名称 属性。正如此处编写的代码,如果我尝试执行 PersonData.Name = "JohnDoe" 编译器将抛出错误,因为 属性 显然是只读的。如果我尝试将 IPersonData 更改为 PersonData pd = New PersonData,那么我显然不再实现接口要求。
我必须这样做,因为这些是必需的接口,不是由我编写或控制的。当最初编写这些接口时,它们是在它们可能没有自动字段属性的时候完成的。
我所知道的是我可以在它后面实现一个字段,当我需要写的时候让程序写入这个字段,属性可以引用这个字段。但是,我觉得这可能不是 2021 年在 c# 中做事的“正确”方式,因为一切都是 属性 并且它添加了我认为可能不需要的代码行。
如果我不能重写界面,或者添加字段是唯一可以做的事情,那么有没有更“正确”的方法来做到这一点?
在有人说“这个问题之前已经被某某某某回答过”之前,请确保他们指的不是继承另一个接口的接口,而该接口确实有效。显然,这个问题仅在具体 class 继承接口时才存在。
您可以通过显式实现接口来实现您的目标。在此示例中,我的实现使用了现有的 属性(调整为类型 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);
产出
Fred
class 现在履行 IPerson
的合同并提供合同(接口)中未定义的附加功能。