出于某种原因,我遇到了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
答案 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()'类型声明是一个错字,但如果没有,那也是一个问题。