从2个共享某些部分的接口中实现一个类

Raj*_*Rao 5 c# oop interface

以下不是好习惯吗?

public interface IMyImmutableData
{
    int Data { get;}
}

public interface IMyMutableData
{
    int Data { set;get;}//implements both get and set
}

public class MyData : IMyImmutableData, IMyMutableData
{
    public int Data{get;set;} //implements both IMyImmutableData, IMyMutableData
}

void Main()
{
    MyData myData = new MyData{Data=10};
    Console.WriteLine(myData.Data);
}
Run Code Online (Sandbox Code Playgroud)

我问的原因是重新共享给我以下警告:“通过此界面访问时可能存在歧义”

我要执行上述操作的原因是,当我创建使用MyData类的方法时,我希望将其作为IMyMutable或IMyImmutable对象发送,以便该方法的用户知道他们可以期望该方法更新或不更新。更新传入的对象。

Joe*_*ant 5

我认为您可以忽略Resharper的警告,因为模棱两可是故意的。

但是,通常使用包装器类来提供对某些内容的只读访问,这样就不能将其强制转换为提供更多功能的任何内容。

public class MyReadonlyData : IMyReadonlyData {
    private MyData instance;

    public int Data {
        get {
            return instance.Data;
        }
    }

    public MyReadonlyData( MyData mydata ) {
        instance = mydata;
    }
}
// no access to original object or setters, period.
Run Code Online (Sandbox Code Playgroud)


dle*_*lev 1

我认为在这种情况下你的结构很好。您不想通过单独的属性显式实现接口,因为这样您Data通过不可变接口访问的实际上将与可变接口访问的不同。

此外,您的实际代码可能更复杂,因为在这种情况下没有歧义:您是Data通过对象本身进行访问,因此不需要考虑接口。

具有显式接口实现的一种解决方案是使用公共支持字段,而不是自动属性:

private int _data;
public int IMyImmutableData.Data
{
    get
    {
        return this._data;
    }
}

public int IMyMutableData.Data
{
    get
    {
        return this._data;
    }
    set
    {
        this._data = value;
    }
}
Run Code Online (Sandbox Code Playgroud)