【发布时间】:2012-08-12 21:16:28
【问题描述】:
假设我开设了一个主要课程Car - 我希望这个课程是抽象的。抽象因为这是我的主要课程,没有人应该成为这个课程的对象。这个类应该只作为“骨干”存在。
我希望只能从Car 的子类创建类(比如说梅赛德斯、法拉利……)。因为每辆车都应该有StartEngine这样的方法,所以我把它放到了major class。假设我有这个:
abstract class Car
{
public string Name { get; set; }
public abstract void StartEngine();
private abstract bool CheckGasoline();
//and so on...
}
class Mercedes : Car
{
private override bool CheckGasoline()
{
//somehow check gasoline and return whatever...
}
public override void StartEngine()
{
if (CheckGasoline())
//start engine...
}
}
这行不通。由于私人摘要:
virtual or abstract members cannot be private
所以我要保护每个私有方法:
abstract class Car
{
public string Name { get; set; }
public abstract void StartEngine();
protected abstract bool CheckGasoline();
//and so on...
}
class Mercedes : Car
{
protected override bool CheckGasoline()
{
//somehow check gasoline and return whatever...
}
public override void StartEngine()
{
if (CheckGasoline())
//start engine...
}
}
这样好吗?我的意思是它正在工作,但它应该是这样吗?当我只需要同一个类中的方法时使用 protected (比如这里:CheckGasoline() 只需要 StartEngine() )。不知何故,私人会更好看。
有什么建议吗?谢谢。
【问题讨论】:
-
你也可以考虑使用接口代替抽象类。 IE。在您的示例中Tesla 将不得不加入
CheckGasoline并混淆您的基类... -
通过使其抽象化,您已经决定每个后代都应该覆盖它,因此它不能是私有的。如果您想对实现进行更多控制,那么接口,甚至可能是事件的聚合 OnCheckGas(object sender, out int percent) 将是可行的方法
-
Thx,但是我仍然没有“感觉”,当使用抽象类或接口要好得多。
-
@miri 这本身就是一个问题:)。 This article 提供了一些非常有用的提示。
标签: c# .net abstract-class