17

メジャー クラスを作成する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...
  }
}

まあ、これはうまくいきません。私的な要約のため:

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())。どういうわけかプライベートが良く見えるでしょう。

助言がありますか?ありがとうございました。

4

4 に答える 4

37

はい、結構です。サブタイプはプライベート メソッドを見ることoverrideができないため、それらも見ることができません。それらは(またはパブリックなどである必要があります)。protectedC# には「メソッド X に対してプライベート」というようなものはないので、そのままで十分です。

于 2012-08-12T21:20:31.393 に答える
13

プライベート メソッドは、それらが属するクラス以外のクラスにはアクセスできません。これには、派生クラスが含まれます。

一方、保護されたメソッドは、それらが属するクラスとその派生クラスの両方にアクセスできます。

protected の使用法は正しいです。

次の記事が役立つ場合があります: http://msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.80).aspx .

于 2012-08-12T21:20:29.727 に答える
3

オーバーライド フックを組み込むことができます。Microsoft は、FrameworkElement.ArrangeCore(...)(を利用するArrangeOverride) とFrameworkElement.MeasureCore(...)(を利用するMeasureOverride) でこれを行います。

例えば:

abstract class Car
{
  public string Name { get; set; }

  public void StartEngine()
  {
    if (CheckGasoline())
        StartEngineOverride();
  }

  protected abstract void StartEngineOverride();
  protected abstract bool CheckGasoline();

  // ...
}

class Mercedes : Car
{
  protected override bool CheckGasoline()
  {
     //somehow check gasoline and return whatever...
  }

  protected override void StartEngineOverride()
  {
     // CheckGasoline was already checked, so just do the override portion.
  }
}
于 2012-08-12T22:10:04.937 に答える
2

次のことをお勧めします。

protected抽象クラスのメンバー変数宣言に使用してみてください。次にpublic、抽象メソッドにも使用します。

次に、派生クラス内で、その派生クラスのメソッドに public と override を使用する必要があります。ただし、これは別のオプションであり、仮想も使用できます。したがって、単一の抽象クラスを使用する代わりに、可能性のあるすべてのCar型クラスを 1 つのパブリックCarClassクラス内にネストするか、それを呼び出したいものにします。

クラスである最初に宣言されたクラスの共有メソッドに仮想メソッドを使用しますAbstract CarCarClass次に、抽象クラスで宣言した仮想メソッドをオーバーライドできるクラス内にもネストされている、宣言された派生クラスの残りに対して public override を使用しますCarCarClassこれは別のオプションですが、別個の個別の抽象クラスよりも宣言するものだけに制限される場合があります。

于 2012-08-13T00:40:13.417 に答える