私有抽象方法有些麻烦

mir*_*iri 10 .net c# abstract-class

假设我做了一个大班Car- 我希望这个班级是抽象的.摘要因为这是我的主要类,所以没有人应该创建这个类的对象.这个类应该只作为"骨干".

我希望只能从子类中创建类Car(比如梅赛德斯,法拉利......).因为每辆车都应该有像StartEngine我把它放入大班的方法.假设我有这个:

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...
  }
}
Run Code Online (Sandbox Code Playgroud)

好吧,这不会奏效.由于私人摘要:

virtual or abstract members cannot be private
Run Code Online (Sandbox Code Playgroud)

所以生病使每个私人方法都受到保护:

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...
  }
}
Run Code Online (Sandbox Code Playgroud)

这好吗?我的意思是它有效,但它应该如何?当我只需要同一个类中的方法时使用protected(就像这里:CheckGasoline()只需要StartEngine()).以某种方式私人会看起来更好.

有什么建议?谢谢.

Mar*_*ell 27

是的,没关系.子类型不能看到私有方法,因此不能override它们:它们必须protected(或公共等).在c#中没有"私有方法X"这样的东西,所以它必须足够原样.


Dan*_*iel 10

除了它们所在的类之外,任何类都无法访问私有方法 - 这包括派生类.

另一方面,受保护的方法既可以访问它们所在的类,也可以访问它们的派生类.

您对受保护的使用是正确的.

您可能会发现这篇文章有所帮助:http://msdn.microsoft.com/en-us/library/ba0a1yw2(v = vs.80).aspx.