首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写抽象方法,而保留方法抽象?

重写抽象方法,而保留方法抽象?
EN

Stack Overflow用户
提问于 2013-09-09 01:14:00
回答 2查看 1.7K关注 0票数 2

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

代码语言:javascript
复制
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(),因为不允许这样做:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-09 02:37:24

在这种情况下,我认为最好将您的逻辑划分为两种方法,一种是使用的方法,另一种是用户使用的方法。假设"CreateCustomColumns“方法是您希望用户重写的名称,那么您可以为自己创建另一个方法,比如"CreateCustomColumnsCore”。这些类可能如下所示:

代码语言:javascript
复制
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。

票数 2
EN

Stack Overflow用户

发布于 2013-09-09 01:26:15

一句话:没有。

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

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

代码语言:javascript
复制
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.
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18690293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档