在C#中的继承接口中分离Get / Set属性

时间:2016-06-06 12:08:14

标签: c# inheritance properties interface

我有两个接口和一个实现:IStateIEditableStateState,其中我有一个名为Value的整数属性。

我想使用IState 获取此属性,IEditableState使用设置

我的代码看起来如此:

interface IState { int Value { get; } }

interface IEditableState:IState { int Value { set; } }

class State:IEditableState {
    int Value { get; set; }
}

显然,我收到警告,IEditableState.Value隐含地隐藏了IState.Value,并且为了清楚起见,我应该添加关键字new。直觉上,这是相同的属性,所以我不明白为什么它应该是新的。

这样做的“干净”方式是什么?

3 个答案:

答案 0 :(得分:1)

这种做法怎么样?使用方法而不是属性实现接口,然后在State中显式实现接口,并在属性Value后面抽象方法调用。这是一个代码示例:

interface IState { int GetValue(); }

interface IEditableState : IState { void SetValue(int value); }

class State : IEditableState
{
    public int Value
    {
        get 
        { 
            return (this as IState).GetValue(); 
        }
        set
        {
            (this as IEditableState).SetValue(value);
        }
    }

    private int _value;
    int IState.GetValue()
    {
        return _value;
    }

    void IEditableState.SetValue(int value)
    {
        _value = value;
    }
}

答案 1 :(得分:1)

在接口中,无法定义虚拟/覆盖,因此您使用.js实现继承接口 - 在类中,这也意味着new和{ {1}}并排,即使后者总是引用前者。

或者,这确实出现在.NET框架本身中,并且通过为Value { get; set; }变体设置单独的界面(例如使用IList<T>IReadOnlyList<T>而不是继承的接口;这允许实现具有单个属性,以满足两者中具有相同名称的项目。

答案 2 :(得分:0)

需要“new”关键字,因为基本接口和继承接口中的属性名称相同,并且您还没有覆盖基接口的属性。在这种情况下,您需要指定新关键字。在这种情况下,您将隐藏基接口的属性,即您将只能使用派生接口的属性。

另一种方法是定义两个具有不同名称的独立属性,如下所示:

sqoop import -m -1 --driver com.vertica.jdbc.Driver --connect "jdbc:vertica://serverName:5443/DBName" --username "user" --password "pass" --query 'select id, name from contacts limit 10' --target-dir "folder/contacts" --hive-import --create-hive-table --hive-table db.contacts