代码之家  ›  专栏  ›  技术社区  ›  ErocM

C#接口问题

  •  1
  • ErocM  · 技术社区  · 14 年前

    出于某种原因,我对接口有问题。我知道已经发布了100个例子,但显然我不够聪明,无法找出答案。。。

    我有以下界面:

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

    以下是我想介绍的课程以及目前为止我所掌握的内容:

      public partial class AddDocumentsDialog : IResetCategoryControl
    
        public string CategoryToAdd
        {
          set
          {
            IResetCategoryControl() ireset = new IResetCategoryControl();
            ireset.CategoryToAdd = value;       
          }
        }
      }
    

    谢谢您!

    爱乐

    8 回复  |  直到 14 年前
        1
  •  6
  •   vgru    14 年前

    以下是有问题的一行:

    IResetCategoryControl() ireset = new IResetCategoryControl();
    

    首先,你需要去掉第一个括号:

    IResetCategoryControl ireset = new IResetCategoryControl();
    

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

    例如,您可能会发现:

    class SomeResetCatControl : IResetCategoryControl 
    {
    
    }
    

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

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

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

        2
  •  11
  •   Justin Niessner    14 年前

    IResetCategoryControl() ireset = new IResetCategoryControl();
    

    首先,在声明变量类型时不使用括号。其次,不能直接实例化接口的实例。要使该声明有效,必须遵循以下原则:

    IResetCategoryControl iReset = new SomeConcreteResetCategoryControl();
    

    理论上,您的类正在实现接口,接口指定您需要一个名为 CategoryToAdd 和一个公众人物。该属性应该设置类的值…而不是另一个类的新实例。

    我希望代码看起来像:

    public partial class AddDocumentsDialog : IResetCategoryControl
    {
        private string categoryToAdd;
    
        public string CategoryToAdd
        {
            set
            {
                // do some logic to validate the value
                categoryToAdd = value;
            }
        }
    }
    

    您可能还希望将接口设计重新考虑为仅设置属性通常是不可取的(有利于使用方法,因为仅设置属性表示正在执行的某些逻辑量,并且该值仅由类内部使用,而不是由使用者再次访问)。

        3
  •  10
  •   Dan Bryant    14 年前

    不能实例化接口;它只是一个契约,而不是对象本身。您需要弄清楚契约的含义,并让AddDocumentsDialog实现该契约,在设置CategoryToAdd时执行它应该执行的操作。

    另一方面,不鼓励只设置属性。最好用一种方法。

        4
  •  2
  •   Liviu Mandras    14 年前

    IResetCategoryControl() ireset = new IResetCategoryControl();
    

    之后 new

        5
  •  1
  •   Tim Robinson    14 年前

    这不是有效的C#——删除第一对 () :

    IResetCategoryControl() ireset = new IResetCategoryControl();
    

    编辑: 它仍然无效。不能实例化接口,只能实例化类。

        6
  •  1
  •   Jonny Cundall    14 年前

        7
  •  1
  •   kwcto    14 年前

    不能实例化接口。新的IResetCategoryControl永远不会起作用。AddDocumentsCatalog使用字符串属性CategoryToAdd实现IResetCAtegoryControl。无论您如何计算返回CategoryToAdd都取决于您。

        8
  •  0
  •   Kendrick    14 年前

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

    我假设'IResetCategoryControl()'类型声明是一个输入错误,但如果不是,那也是一个问题。