如何实现具有公共属性但私有设置方法的多个接口?
Posted
技术标签:
【中文标题】如何实现具有公共属性但私有设置方法的多个接口?【英文标题】:How do I implement multiple interfaces with public properties but private set methods? 【发布时间】:2019-08-26 15:05:58 【问题描述】:我有两个接口:
public interface IFooFile
string Name get;
public interface IFooProduct
string Name get;
我想用私有集来实现这两个:
public class AFooThing : IFooFile, IFooProduct
public string IFooFile.Name get; private set;
public string IFooProduct.Name get; private set;
但是访问修饰符正在创建错误:
“AFooThing.IFooFile.Name.set”的访问器必须比属性或索引器“AFooThing.IFooFile.Name”更严格
如果我像这样实现类,我不会收到访问修饰符错误,但我没有第二个接口:
public class AFooThing : IFooFile
public string Name get; private set;
我不知道如何在不引起问题的情况下使用添加的“私有集”实现这两个接口。处理这个问题的正确方法是什么?
【问题讨论】:
您需要 2 个名称属性吗?如果是这样,为什么?你不觉得这很奇怪吗? 如果您只需要同时满足这两个接口,只需使用 oneName
属性实现它们即可。见here
@maccettura 仅当相同的名称适用于两个属性时才有效。产品可以允许名称中包含斜杠,并且不需要扩展名。它适用于ICollection.Count
和ICollection<T>.Count
,因为它们在概念上是相同的。
@maccettura 它们是两种不同的格式。
【参考方案1】:
您不能对显式接口使用访问修饰符,它是public
。您也不能添加set
属性,因为它在interface
中不存在。您可以做的是通过使用支持字段来实现您的目标,例如
public class AFooThing : IFooFile, IFooProduct
private string _fooFileName;
private string _fooProductName;
string IFooFile.Name => _fooFileName;
string IFooProduct.Name => _fooProductName;
public AFooThing()
_fooFileName = "FooFileName";
_fooProductName = "FooProductName";
【讨论】:
这将起作用,并且为什么需要以这种方式完成它是有道理的。这只是比我希望的更多的代码,因为它们的数量相当可观。感谢您的帮助。以上是关于如何实现具有公共属性但私有设置方法的多个接口?的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C:(私有/公共属性)为外部类调用设置只读属性,为自调用设置只读属性