2

我有一些用户控件,我想为其指定属性和方法。

它们继承自基类,因为它们都具有“Foo”和“Bar”等属性,而我使用基类的原因是我不必在每个派生类中手动实现所有这些属性。

但是,我想要一个仅在派生类中而不是在基类中的方法,因为基类不知道如何“执行”该方法,因此我正在考虑为此使用接口。如果我把它放在基类中,我必须定义一些主体来返回一个值(这将是无效的),并始终确保覆盖方法没有调用基类。方法

使用基类和接口来公开方法是正确的方法吗?这似乎很迂回,但我认为这样做的每一种方式似乎都是错误的......

如果问题不清楚,请告诉我,这可能是一个愚蠢的问题,但我想做到这一点。

编辑:感谢所有提出优秀抽象建议的人,但这打破了设计师。如果摘要不是一个可选择的选项,你会怎么做?

4

5 回答 5

5

或者,您可以在基类中将方法定义为“抽象”,这不需要类来实现它。例如:

abstract class A
{
   public abstract void B();
}

当然,这也会迫使您的基类成为抽象类,但听起来这对您来说很好用。

请参阅MSDN 上的抽象方法

更新

由于abstract设计器问题不适合您,您可以将方法定义为基类的一部分,如果直接从基类调用它,则让它抛出NotImplementedException :

void DerivMethod()
{
    // Must be implemented by derived class
    throw new NotImplementedException();
}

否则,使用 aninterface就可以了,特别是如果上述内容在您的嘴里留下不好的味道...

于 2010-06-08T16:30:01.137 回答
2

您应该使您的基类成为抽象类。然后基类可以通过标记方法抽象来实现接口。

http://msdn.microsoft.com/en-us/library/aa664435(VS.71).aspx

于 2010-06-08T16:30:44.593 回答
1

在您的基类中将该方法标记为抽象。您将被迫在派生类中实现它,但基类不需要有方法定义。

于 2010-06-08T16:31:37.500 回答
1

我同意其他人的观点,但是让您的用户控件抽象对设计师来说有一些问题。设计者通常不会显示抽象的用户控件。

我会在基类中实现接口方法。如果要确保继承者正确覆盖这些方法,可以在方法中抛出 NotImplemented 异常或 Assert.Fail。

于 2010-06-08T16:35:02.753 回答
0

在基类中声明函数签名并使用“抽象”修饰符。

于 2010-06-08T16:31:53.567 回答