【问题标题】: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 它们是两种不同的格式。

标签: c# interface access-modifiers


【解决方案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";
    }
}

【讨论】:

  • 这将起作用,并且为什么需要以这种方式完成它是有道理的。这只是比我希望的更多的代码,因为它们的数量相当可观。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2012-10-29
  • 2014-06-18
  • 2014-04-07
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多