【发布时间】:2013-09-12 11:21:42
【问题描述】:
我想重写一个抽象方法,但要保持它是抽象的,所以派生类需要自己实现它。
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 等派生类中再次覆盖它?
当然它仍然可以被覆盖,但是没有任何东西可以向开发者表明它必须被覆盖......这是我的目标。
-布伦丹
【问题讨论】:
-
我发誓这个问题是不久前被问到的。 Aaanyways:这是不可能的,只是让你的共享实现一个不同的方法,或者使用模板方法模式。显然,如果没有人可以直接调用实现
B.A(),那么重写public abstract方法是没有意义的。 -
如果您稍微解释一下您正在尝试做什么,这可能会有所帮助。从这里看起来您正试图在 B 类中提供一个 半实现 ,派生类必须覆盖该类,但可以选择是否使用基类,恕我直言,这很令人困惑。看到一个用例真的很有帮助。
-
如果有帮助,我已将用例添加到帖子中。
-
@BrendanHill Near 据我所知,将
ClientComponentController的实现移动到非抽象保护方法不会解决任何问题。我也看不出覆盖需要调用基本方法的太多原因 - 似乎您的设计是覆盖类 add 新列到网格,所以你不妨只是始终从构造函数调用基本实现。 -
@BrendanHill 如果您希望覆盖类能够控制是否添加基类的列,您始终可以公开列定义的集合并使此操作显式而不是让它成为继承链的产物。
标签: c# oop overriding abstract