C#接口问题

Ero*_*ocM 1 c# interface

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

我有以下界面:

namespace DocStore.Interfaces
{
  public interface IResetCategoryControl
  {
    string CategoryToAdd { set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想将CategoryToAdd设置为一个值.

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

  public partial class AddDocumentsDialog : IResetCategoryControl

    public string CategoryToAdd
    {
      set
      {
        IResetCategoryControl() ireset = new IResetCategoryControl();
        ireset.CategoryToAdd = value;       
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Eroc

Jus*_*ner 11

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

IResetCategoryControl() ireset = new IResetCategoryControl();
Run Code Online (Sandbox Code Playgroud)

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

IResetCategoryControl iReset = new SomeConcreteResetCategoryControl();
Run Code Online (Sandbox Code Playgroud)

但是有一个更大的问题:

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

我希望代码看起来像:

public partial class AddDocumentsDialog : IResetCategoryControl
{
    private string categoryToAdd;

    public string CategoryToAdd
    {
        set
        {
            // do some logic to validate the value
            categoryToAdd = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*ant 10

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

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


Gro*_*roo 6

以下行是有问题的:

IResetCategoryControl() ireset = new IResetCategoryControl();
Run Code Online (Sandbox Code Playgroud)

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

IResetCategoryControl ireset = new IResetCategoryControl();
Run Code Online (Sandbox Code Playgroud)

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

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

例如,您可能会发现:

class SomeResetCatControl : IResetCategoryControl 
{

}
Run Code Online (Sandbox Code Playgroud)

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

public partial class AddDocumentsDialog : IResetCategoryControl
{
   private string _categoryToAdd = "";
   public string CategoryToAdd
   {
     set
     {
        _categoryToAdd = value;
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

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