5

私は以下のような状況にあります:

class Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base
{
}

class DerivedB : Base
{
}

次のようなことを行うと、各派生クラスが独自のxの静的インスタンスを持つようにこれを設定しようとしています。

 DerivedA.x = 5;
 DerivedB.x = 10;

それから私が走るとき:

 DerivedA.myMethod(); //The result will be 10
 DerivedB.myMethod(); //The reusult will be 15

このようなことはできますか?これを実現するために派生クラスを設定するにはどうすればよいですか?みんなありがとう。

編集:基本的に、私はたくさんの派生クラスを持っており、それぞれがそのクラスに固有のプロパティを持っています。インスタンスごとに変化するわけではないので、静的変数である必要があると思います。また、そのプロパティはメソッドによって設定されます。これは、これらの各クラスで同じです。これらの派生クラスのそれぞれで、そのプロパティとメソッドのロジックをコピーして貼り付ける必要がないようにしています。どういうわけか、そのロジックを、これらの各クラスの派生元である基本クラスに移動するのが最善だと思いました。ただし、各派生クラスには、そのプロパティの独自のコピーが必要です。私は必ずしもこのようにする必要はありません、そしてあなたたちが何かを持っているなら、私はいくつかのより良い実践の提案を聞いてうれしいです..ありがとう!

4

4 に答える 4

12

ええ、はい、できますが、ジェネリックスを使ったちょっとしたトリックを中心に展開しています。

その静的フィールドを必要としないように、または少なくとも子孫ごとに必要としないように設計を修正すると、はるかに優れていますが、ここで説明します。

class Base<TDescendant>
    where TDescendant : Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{
}

これは、静的フィールドを持つジェネリック型が、呼び出す型ごとにそれらの静的フィールドの個別のコピーを取得するという事実に依存しています。

ただし、DerivedAまたはDerivedBから降りる場合は注意が必要なので、このレーンを下ることはお勧めしません。

于 2011-02-20T21:35:29.243 に答える
5

すべての派生型でフィールドとメソッドを再定義して非表示にする必要があります。

例:

class DerivedA : Base
{
  public new static int x;
  public new int myMethod()
  {
    x += 5;
    return x;
  }
}

注:このようにしないでください。デザインを修正します。

編集:

実際、私は似たような構成を持っています。私はそれを抽象(デフォルト値が必要な場合は使用virtual)プロパティで解決します。このプロパティは基本クラスから使用されます。

public abstract class Base
{
   public abstract string Name { get; }

   public void Refresh()
   {
     //do something with Name
   }
}

public class DerivedA
{
  public override string Name { get { return "Overview"; } }
}

ユースケースに合わせて調整できるはずです。もちろん、protected派生クラスのみがプロパティを表示できるようにする必要がある場合は、プロパティを作成できます。

于 2011-02-20T21:31:35.793 に答える
1

キーとしてタイプを使用する静的辞書で十分です。つまり、派生タイプごとにロジックの繰り返しや異なる値を回避しますが、インスタンス間で共有します。

public class Base
{
    private static Dictionatry<Type,int> _values;

    public int MyMethod()
    {
        _values[this.GetType()]+=5;
        return _values[this.GetType()];
    }
}
于 2016-05-14T19:29:23.583 に答える
0

私は通常、サブクラス固有のものを抽象getプロパティとして実装します

public class Base
{
    // You must pick one option below

    // if you have a default value in the base class
    public virtual int x { get { return 7; /* magic default value */} }

    // if you don't have a default value
    // if you choose this alternative you must also make the Base class abstract
    public abstract int x { get; }
}

public class DerivedA : Base
{
    public override int x { get { return 5; } }
}

public class DerivedB : Base
{
    public override int x { get { return 10; } }
}
于 2011-02-20T21:58:50.957 に答える