您可以使用接口来创建接口的const和非const版本吗?

时间:2009-08-25 02:23:28

标签: c# interface

我目前正在阅读Effective C#,发现以下行非常混乱:

  

最后,但同样重要的是,你可以   使用接口来创建const和   非接口版本的接口:

界面有哪些和非对象版本?我们在哪里使用它?

支持代码:

public interface IConstNameValuePair
{
  object Name
  {
    get;
  }

  object Value
  {
    get;
  }
}
public interface INameValuePair
{
  object Value
  {
    get;
    set;
  }
}

// Usage:
public class Stuff : IConstNameValuePair, INameValuePair
{
  private string _name;
  private object _value;

  #region IConstNameValuePair Members
  public object Name
  {
    get
    {
      return _name;
    }
  }

  object IConstNameValuePair.Value
  {
    get
    {
      return _value;
    }
  }

  #endregion

  #region INameValuePair Members

  public object Value
  {
    get
    {
      return _value;
    }
    set
    {
     _value = value;
    }
  }
  #endregion
}

3 个答案:

答案 0 :(得分:3)

它表明,通过其中一个接口,您无法实际修改该值(未定义'set'属性)。将这个'const'称为'const'有点可疑,因为它实际上是一个具有特殊含义的关键字。但这就是作者的意思。

答案 1 :(得分:1)

  

界面有哪些和非对象版本?

我认为他的意思是'const'和'non-const',就像C ++程序员理解它们一样,即如下所示。

'const'接口是一个无法改变其属性的接口。例如,在下面的代码中,test1方法可以获取但不能设置stuff实例的属性。

'非const'接口是一个可以改变其属性的接口,例如test2方法可以设置以及获取stuff实例的属性。

void test()
{
  Stuff stuff = new Stuff();
  test1(stuff);
  test2(stuff);
}

void test1(IConstNameValuePair stuff)
{
}

void test2(INameValuePair stuff)
{
}

答案 2 :(得分:0)

首先,您需要明确所使用的名称(const和nonconst)的选择非常差。 Const通常指的是值为 const ant的想法,这意味着它无法更改。

查看这两个接口,IConstNameValuePair仅定义了一个get属性访问器。当你有Stuff的实例被转换为IConstNameValuePair时,你实际上有一个不可更改的实例,因为通过该接口无法更改值。

INameValuePair接口定义了get和set属性访问器。如果您有Stuff的实例已转换为INameValuePair,那么您实际上有一个可更改的实例,因为通过该界面您可以更改值。

话虽这么说,解决这个问题肯定比使用两个不同的接口更好。