2010-11-03 123 views
1

出于某种原因,我遇到了接口问题。我知道一个100个例子已经发布,但显然我不是足够聪明,看着办吧......C#接口问题

我有以下接口:

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

+1

你有什么问题?什么是错误信息? – 2010-11-03 14:21:10

+0

这不工作?如果AddDocumentsDialog类不在同一个命名空间中,那么你需要在接口名称中使用它,例如。 'DocStore.Interfaces.IResetCategoryControl' – 2010-11-03 14:22:48

+0

你到底在做什么?这个二传手并没有太多的意义,因为它现在是... – Doggett 2010-11-03 14:24:03

回答

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; 
    } 
    } 
} 

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

+0

这就是我一直在寻找的东西,但正如你所说,这是错误的。每个人的帖子都让我重新思考我是如何做到这一点的,而且我重新设计了它,现在它运行得更顺畅。 – ErocM 2010-11-03 14:47:18

1

这不是有效的C# - 删除了第一双()

IResetCategoryControl() ireset = new IResetCategoryControl(); 

编辑:它仍然不是有效的C#。你不能实例化一个接口,只有类。

+1

第二部分,他试图创建一个界面也是无效的... – Doggett 2010-11-03 14:23:12

0

从它的外观来看,只要你设置了它的一个属性,ireset就会超出范围。我猜这应该可能是一个成员变量...我做了'IResetCategoryControl()'类型声明是一个错误的假设,但如果不是,这也是一个问题。

+0

不知道为什么这是downvoted,因为它是正确的。我错过了实例化一个界面,但是那里有太多错误,很难知道去哪里寻找...... – Kendrick 2010-11-04 21:36:21

10

你不能实例化一个接口;它仅仅是一个合同而不是一个对象本身。你需要弄清楚契约是什么意思,并且让AddDocumentsDialog实现该契约,做任何当CategoryToAdd被设置时应该做的事情。

在旁注中,不鼓励设置属性。最好使用一种方法。

+0

发行编号为3的+1 ... – Kendrick 2010-11-03 14:24:53

+0

+1的设置专用注释。这是使用属性的一种相当不寻常的方式。 – Groo 2010-11-03 14:28:44

1

ireset仅在本地定义,在集合内。您将无法访问任何其他地方

11

我不知道你想在你的二传手做什么...但下面的行导致您的问题:

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; 
     } 
    } 
} 

你也可能要重新考虑你的界面设计只设置属性通常不鼓励(赞成使用的方法,因为一组只有属性表示一定数量的逻辑被执行,并且该值仅由该类内部使用而不是由消费者再次访问)。

2

无法实例接口:

IResetCategoryControl() ireset = new IResetCategoryControl(); 

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

1

你不能实例化一个接口。新的IResetCategoryControl永远不会工作。 AddDocumentsCatalog使用字符串属性CategoryToAdd实现IResetCAtegoryControl。无论您做什么计算返回CategoryToAdd由您决定。