【问题标题】:Separate Get/Set property in inherited interfaces in C# [duplicate]在 C# 中继承的接口中分离 Get/Set 属性 [重复]
【发布时间】:2016-10-06 00:55:37
【问题描述】:

我有两个接口和一个实现: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。直观地说,这是同一个属性,所以我不明白为什么它应该是新的。

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

【问题讨论】:

  • 你为什么要这个..你能解释一下吗..比我能帮助你
  • 最终,我们的目标是通过强制将IState 强制转换为IEditableState 来更好地组织代码以进行修改。请注意是否相关,但在我的情况下,State 恰好是一个单例,我使用 IState 通过服务定位器访问它。

标签: c# inheritance properties interface


【解决方案1】:

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

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

interface IState { int ValueGet { get; } } interface IEditableState:IState { int ValueSet { set; } } class State:IEditableState { int ValueGet { get; } int ValueSet { set; } }

【讨论】:

    【解决方案2】:

    这种方法怎么样?用方法而不是属性来实现你的接口,然后在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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      或者,这确实出现在 .NET 框架本身中,并且通过为Readonly 变体(例如IList<T>IReadOnlyList<T>)而不是继承的接口提供单独的接口来规避;这允许实现有一个属性来满足两者中具有相同名称的那些项目。

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 2019-05-08
        相关资源
        最近更新 更多