【问题标题】:Explicit Interface Implementation and Multiple Interfaces显式接口实现和多个接口
【发布时间】:2011-10-19 00:05:51
【问题描述】:

在我的程序的某些位置,我需要访问对象的具体实现(Test),而在其他位置,我只需要一个只读接口(ITest)。这是为了防止用户假设所有属性都已设置并可修改

例如,如果用户调用 TestFactory.Search,则返回的集合将阻止他们修改属性 A 和使用 CollectionB(未在函数内部设置)。我希望能够使用对象初始值设定项并保持属性名称相同。我有以下解决方案:

public interface IReadOnly
{
    int Id{ get; }
    string Name{ get; }
}

public class ClassA : IReadOnly
{
    int Id{ get; internal set; }
    string Name{ get; set; }
}

public interface ITest
{
    int Id{ get; }
    IReadOnly A { get; }
}

public class Test : ITest
{
    private ClassA classA = new ClassA();

    int Id{ get; internal set; }
    IReadOnly ITest.A{ get{ return classA; } }
    public ClassA A
    { 
        get
        { 
            return classA;
        }  
        set
        {
             classA = value;
        }
    }

    public IEnumerable<string> CollectionB {get;set;}
}

public static class TestFactory
{
    IEnumerable<ITest> Search(){ /**/ }
    Test Read(){ /**/ };
}

是否有更好的方法来解决这个问题?是否滥用显式接口实现的概念?

【问题讨论】:

  • Test 类也实现IReadOnly 然后只使用test as IReadOnly o test

标签: c# interface implementation


【解决方案1】:

我会让您的 Test 类实现 IReadOnly 和 ITest 这两个接口。如果要限制 setter 访问,请强制转换为 IReadOnly,否则,请使用 ITest 或具体的 Test。

【讨论】:

    【解决方案2】:

    也许创建一个抽象类,然后子类化完全访问和只读行为?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2015-10-23
      相关资源
      最近更新 更多