我想重写一个抽象方法,但是要保持它的抽象,所以需要派生类来实现它。
public abstract class ComponentController
{
public abstract void CreateCustomColumns();
}
public abstract class ClientComponentController : ComponentController
{
public override void CreateCustomColumns()
{
// All grids to do with clients should show these columns.
Grid.AddColumn("Client" ...
Grid.AddColumn("ClientLocation" ...
Grid.AddColumn("ClientPhoto" ...
}
}
public class ClientInvoicesComponentController : ClientComponentController
{
public override void CreateCustomColumns()
{
base.CreateCustomColumns();
// On top of the generic columns, I also want to show these.
Grid.AddColumn("InvoiceNumber" ...
Grid.AddColumn("InvoiceDate" ...
}
}
public class ClientCommunicationsComponentController : ClientComponentController
{
public override void CreateCustomColumns()
{
base.CreateCustomColumns();
// On top of the generic columns, I also want to show these.
Grid.AddColumn("CommunicationDate" ...
Grid.AddColumn("CommunicationType" ...
}
} 在此代码中,不需要ClientInvoicesComponentController来实现CreateCustomColumns(),因为不允许这样做:
public abstract class ClientComponentController : ComponentController
{
public abstract override void CreateCustomColumns()
{
Grid.AddColumn("Client" ...
Grid.AddColumn("ClientLocation" ...
Grid.AddColumn("ClientPhoto" ...
}
}
--> "Abstract method cannot declare a body"那么,我如何在CreateCustomColumns()中重写ClientComponentController,但仍然强制在派生类(如ClientInvoicesComponentController )中重写它?
当然,无论如何它仍然可以被重写,但是没有什么可以向开发人员表明它必须被重写…这就是我的目标。
-Brendan
发布于 2013-09-09 02:37:24
在这种情况下,我认为最好将您的逻辑划分为两种方法,一种是使用的方法,另一种是用户使用的方法。假设"CreateCustomColumns“方法是您希望用户重写的名称,那么您可以为自己创建另一个方法,比如"CreateCustomColumnsCore”。这些类可能如下所示:
public abstract class ComponentController
{
protected abstract void CreateCustomColumnsCore();
}
public abstract class ClientComponentController : ComponentController
{
protected override void CreateCustomColumnsCore()
{
// your code here
CreateCustomColumns(); // call users' implementation
}
public abstract void CreateCustomColumns();
}
public class ClientInvoicesComponentController: ClientComponentController
{
public override void CreateCustomColumns()
{
// user must implement this method.
}
}用户仍然可以重写您的CreateCustomColumnsCore方法,如果您允许用户这样做,这可能是一个特性或一个bug。
发布于 2013-09-09 01:26:15
一句话:没有。
一个抽象的方法意味着它被声明,但没有定义。在这种情况下,被定义但抽象并不真正有意义,所以这是不可能的。
我也非常想知道你的用例。如果您希望子类继承某些行为,但也要添加它们自己的功能,您可以这样做:
public abstract class BaseClass
{
public void DoSomething()
{
// Base class behaviour goes here.
DoSomethingInternal();
}
protected abstract void DoSomethingInternal();
}
public class SubClass : BaseClass
{
protected override void DoSomethingInternal()
{
// Sub class behaviour goes here.
}
}https://stackoverflow.com/questions/18690293
复制相似问题