接口和基类混合,正确的实现方式

时间:2010-06-08 16:27:59

标签: c# inheritance interface base-class

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

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

但是,我希望有一个方法只在派生类中,而不是在基类中,因为基类不知道如何“执行”该方法,所以我想使用一个接口这个。如果我把它放在基类中,我必须定义一些body来返回一个值(这将是无效的),并始终确保重写方法不是调用基类。方法

正确的方法是使用基类和接口来公开方法吗?这看起来非常圆润,但我想做的每一种方式似乎都错了......

如果问题不明确,请告诉我,这可能是一个愚蠢的问题,但我想这样做。

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

5 个答案:

答案 0 :(得分:5)

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

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

当然这会强制你的基类也是抽象的,但听起来这对你来说很合适。

请参阅MSDN上的Abstract methods

更新

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

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

否则,使用interface会很好,特别是如果上面的味道很差......

答案 1 :(得分:2)

您应该将基类设为Abstract类。然后基类可以通过标记方法abstract来实现接口。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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