2

我想重写一个抽象方法,但要保持它是抽象的,所以派生类需要自己实现它。

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"

那么,如何在 ClientComponentController 中覆盖 CreateCustomColumns(),但仍然强制在 ClientInvoicesComponentController 等派生类中再次覆盖它?

当然,无论如何它仍然可以被覆盖,但是没有任何东西向开发人员表明它必须被覆盖......这是我的目标。

-布伦丹

4

2 回答 2

4

一句话:不是。

抽象的方法意味着它已声明但未定义。在这种情况下,被定义但抽象并没有真正的意义,所以这是不可能的。

我也很想知道你的用例。如果您希望子类继承某些行为,但还要添加它们自己的功能,则可以这样:

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.
    }
}
于 2013-09-09T01:26:15.087 回答
2

在这种情况下,我认为最好将您的逻辑分为两种方法,一种是您使用的方法,另一种是您的用户使用的方法。假设“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 方法,这可能是基于您是否允许用户执行此操作的功能或错误。

于 2013-09-09T02:37:24.717 回答