如何实现具有公共属性但私有设置方法的多个接口?

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 个名称属性吗?如果是这样,为什么?你不觉得这很奇怪吗? 如果您只需要同时满足这两个接口,只需使用 one Name 属性实现它们即可。见here @maccettura 仅当相同的名称适用于两个属性时才有效。产品可以允许名称中包含斜杠,并且不需要扩展名。它适用于ICollection.CountICollection<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:(私有/公共属性)为外部类调用设置只读属性,为自调用设置只读属性

如果设置类的公共属性,您是不是对 __init__ 方法进行单元测试?

类-封装

java接口定义的方法是私有吗?

Java接口

YOURLS 将“缩短”接口设为私有