C#接口问题

时间:2010-11-03 14:19:47

标签: c# interface

出于某种原因,我遇到了Interfaces的问题。我知道已经发布了100个例子,但显然我不够聪明,无法弄明白......

我有以下界面:

namespace DocStore.Interfaces
{
  public interface IResetCategoryControl
  {
    string CategoryToAdd { set; }
  }
}

我想将CategoryToAdd设置为一个值。

这是我想要设置的课程以及我到目前为止的课程:

  public partial class AddDocumentsDialog : IResetCategoryControl

    public string CategoryToAdd
    {
      set
      {
        IResetCategoryControl() ireset = new IResetCategoryControl();
        ireset.CategoryToAdd = value;       
      }
    }
  }

我在AddDocumentDialog类中做错了什么?我不能让那部分工作。

谢谢!

Eroc

8 个答案:

答案 0 :(得分:11)

我不确定你在你的二传手中做了什么......但是以下一行会给你带来问题:

IResetCategoryControl() ireset = new IResetCategoryControl();

首先,在声明变量类型时不要使用括号。其次,您无法直接实例化Interface的实例。为了使该陈述有效,它必须是:

IResetCategoryControl iReset = new SomeConcreteResetCategoryControl();

但是存在一个更大的问题:

从理论上讲,您的类正在实现接口,并且接口指定您需要一个名为CategoryToAdd的属性和一个公共setter。该属性应该是在您的类上设置值...而不是另一个类的新实例。

我希望代码看起来像:

public partial class AddDocumentsDialog : IResetCategoryControl
{
    private string categoryToAdd;

    public string CategoryToAdd
    {
        set
        {
            // do some logic to validate the value
            categoryToAdd = value;
        }
    }
}

您可能还想重新考虑您的界面设计,因为通常不鼓励设置属性(支持使用方法,因为仅设置属性表示正在执行一定量的逻辑,并且该值仅由内部使用而不是消费者再次访问的类。)

答案 1 :(得分:10)

您无法实例化接口;它只是一个契约,而不是一个对象本身。您需要确定合同的含义,并让AddDocumentsDialog实现该合同,并在设置CategoryToAdd时执行任何操作。

另外,不建议使用仅限设置的属性。最好使用一种方法。

答案 2 :(得分:6)

以下行是有问题的:

IResetCategoryControl() ireset = new IResetCategoryControl();

首先,你需要摆脱第一个括号:

IResetCategoryControl ireset = new IResetCategoryControl();

接下来,您无法实例化接口。接口只是一个必须由具体类实现的签名。

如果您正在查看其他人的代码,请右键单击IResetCategoryControl并选择“查找所有引用”以搜索此接口是否已在某个类中实现。

例如,您可能会发现:

class SomeResetCatControl : IResetCategoryControl 
{

}

另一方面,您似乎只需要在setter方法中设置内部私有字段。在这种情况下你应该这样做:

public partial class AddDocumentsDialog : IResetCategoryControl
{
   private string _categoryToAdd = "";
   public string CategoryToAdd
   {
     set
     {
        _categoryToAdd = value;
     }
   }
}

但正如其他人已经指出的那样,使用只写属性是非常不寻常的,并且表明设计错误。

答案 3 :(得分:2)

您无法实例化界面:

IResetCategoryControl() ireset = new IResetCategoryControl();

new关键字之后,您必须使用实现该接口的对象。

答案 4 :(得分:1)

这是无效的C# - 删除第一对()

IResetCategoryControl() ireset = new IResetCategoryControl();

编辑:它仍然无效C#。您无法实例化接口,只能实现类。

答案 5 :(得分:1)

ireset仅在本地内定义。你将无法在其他任何地方访问它

答案 6 :(得分:1)

您无法实例化界面。新的IResetCategoryControl永远不会起作用。 AddDocumentsCatalog使用字符串属性CategoryToAdd实现IResetCAtegoryControl。无论你做什么计算来返回CategoryToAdd都取决于你。

答案 7 :(得分:0)

从它的外观来看,一旦你设置了它的一个属性,ireset就会超出范围。我猜这应该是一个成员变量...

我假设'IResetCategoryControl()'类型声明是一个错字,但如果没有,那也是一个问题。