0

新しいイベントとメソッドを追加して、基本クラスを特殊化したいと考えています。たとえば、クラス B はクラス A から継承されます。ただし、コード内でクラス B インスタンスへの参照をその基本型 A として保持している場合、B から何かにアクセスする必要があるたびにダウンキャストする必要がありますか。 EventB1、または MethodB1 を呼び出しますか?

if (obj is B) 
{ 
  B m = (B)obj;
  m.EventB1 += EventHandlerB1; 
}

また、上記のように基本クラスに switch ステートメントがあるとします。B にさらにケースを追加するのは悪い習慣ですか?

Class A
{
  public event EventHandler EventA1

  public void MethodA1()
  {
    //some code
  }

  protected virtual void ProcessWorkItem(workItem type)
  {
    switch (type)
    {
      case workItem.A1:
        ..
        break;
      case workItem.A2:
        ..
        break;
      case workItem.A3:
        ..
        break;
    }
  }
}

Class B : A
{
  public event EventHandler EventB1

  public void MethodB1()
  {
    //some code
  }

  protected override void ProcessWorkItem(workItem type)
  {
    base.ProcessWorkItem(type);

    switch (type)
    {
      case workItem.B1:
        ..
        break;
      case workItem.B2:
        ..
        break;
      case workItem.B3:
        ..
        break;
    }
  }
}
4

2 に答える 2

2

EventB1 にサブスクライブしたり、MethodB1 を呼び出したりするなど、B から何かにアクセスする必要があるたびに、ダウンキャストする必要がありますか?

絶対。これは、ここにデザインの匂いがあることを示しているはずです。それが必ずしも悪いというわけではありませんが、少なくともよりクリーンなアプローチがあるかどうかを検討するよう促すはずです。

また、上記のように基本クラスに switch ステートメントがあるとします。B にさらにケースを追加するのは悪い習慣ですか?

それが何をしようとしているのかについてもっと知らなければ、それを伝えるのは難しい. 継承の代わりに構成を使用することがここで役立つかどうかは明らかではありませんが、通常は検討する価値があります。インターフェイスの使用を検討することもできます。必要に応じて を作成して、 と の両方AB同じインターフェイスを実装できます。多分。言うのは難しいです:)BA

于 2012-07-31T08:14:28.993 に答える
0

はい、タイプ B のメソッドにアクセスするには、オブジェクトをタイプ B にキャストする必要があります。絶対にそうしたくない場合は、Reflection を使用してそれぞれのメソッドを呼び出すことができます。ただし、何をしたいのかを詳しく知らずにそれをお勧めすることはありません。

また、イベントに関連して頭に浮かぶこと: イベントを呼び出したい場合は、それが宣言されているクラスに実装されたコードからそれを行う必要があります。

スイッチについて:場合によると思います。最初に...オーバーライドを使用し、次に、この関数が何を実行/提供するかに応じて、baseを呼び出すかどうかを決定します。

よろしく、マーティン

Class A
{
  public event EventHandler EventA1

  public void MethodA1()
  {
    //some code
  }

  protected virtual void FireEventA1()
  {
    if (EventA1 != null)
      EventA1(new EventArgs());
  }


  protected virtual void ProcessWorkItem(workItem type)
  {
    switch (type)
    {
      case workItem.A1:
        ..
        break;
      case workItem.A2:
        ..
        break;
      case workItem.A3:
        ..
        break;
    }
  }
}

Class B : A
{
  public event EventHandler EventB1

  public void MethodB1()
  {
    //some code
  }

  protected virtual void FireEventB1()
  {
    if (EventB1 != null)
      EventB1(new EventArgs());
  }

  protected override void ProcessWorkItem(workItem type)
  {
    base.ProcessWorkItem(type);
    switch (type)
    {
      case workItem.B1:
        ..
        break;
      case workItem.B2:
        ..
        break;
      case workItem.B3:
        ..
        break;
    }
  }
}
于 2012-07-31T08:31:03.013 に答える