4

私は次の基本クラスと派生(簡潔にするために部分的)クラスを持っています:

class Base {
     public abstract int[] someArray { get; }
}

class Derived : Base {
     private readonly static int[] _someArray = new int[] { 1,2,3,4 };
     public override int[] someArray { 
         get {
              return _someArray;
         }
     }
}

私が今欲しいのは、ゲッターnew int[] { 1,2,3,4 }return部分に入れます。ただし、ゲッターが呼び出されるたびに新しい配列が作成されます。

クラスのすべてのオブジェクトで同じままである、ある種のオブジェクトを直接返すことは可能Derivedですか?

(私はこれが無効なC#であることを知っています)の線に沿った何か:

  get {
        return (int[]) { 1, 2, 3, 4 };
  }
4

2 に答える 2

4

new int[] { 1,2,3,4 }パーツをゲッターに入れたいだけなら、それは簡単です...

 private static int[] _someArray = null;
 public override int[] someArray { 
     get {
          return _someArray ?? (_someArray = new int[] { 1,2,3,4 });
     }
 }

ただし、その場合は読み取り専用が失われます。

更新:ジェネリックソリューション

または、そのためにジェネリックスの機能を悪用する可能性があります。

// Of course you still want to use the non-generic class Base
abstract class Base {
    public abstract int[] someArray { get; }
}

abstract class Base<T> : Base where T: Base<T> {
     // Will be created once for every T, i.e. every derived class.
     private static int[] _someArray;

     public override int[] someArray {
        get { return _someArray ?? (_someArray = CreateArray()); }
     }

     protected abstract int[] CreateArray();
}

sealed class Derived : Base<Derived> {
     protected sealed override int[] CreateArray() { 
         return new int[] { 1,2,3,4 };
     }
}

sealed class DerivedB : Base<DerivedB> {
    protected sealed override int[] CreateArray() {
        return new int[] { 2,3,4,5 };
    }
}

これは1つの継承レベルでのみ機能することに注意してください。そのため、いくつかのものを封印しました:)

于 2012-12-14T10:38:31.457 に答える
0

私の知る限り、それはC#では機能しません。フィールドを使用するか、プロパティ/メソッドで変数を作成できます。VB.NETには、Staticローカル変数のキーワードがあります(以下を参照)。

多くの派生クラスがあり、派生クラスごとに静的フィールド配列を使用したくないとコメントしました。その場合は、別のアプローチを使用することをお勧めします。基本クラスで静的クラスを使用し、Dictionary派生クラスごとに列挙型を使用できます。

abstract class Base
{
    public abstract DerivedType Type { get; }

    protected static readonly Dictionary<DerivedType, int[]> SomeDict;

    static Base()
    {
        SomeDict = new Dictionary<DerivedType, int[]>();
        SomeDict.Add(DerivedType.Type1, new int[] { 1, 2, 3, 4 });
        SomeDict.Add(DerivedType.Type2, new int[] { 4, 3, 2, 1 });
        SomeDict.Add(DerivedType.Type3, new int[] { 5, 6, 7 });
        // ...
    }

    public static int[] SomeArray(DerivedType type)
    {
        return SomeDict[type];
    }
}

public enum DerivedType
{
    Type1, Type2, Type3, Type4, Type5
}

class Derived : Base
{
    public override DerivedType Type
    {
        get { return DerivedType.Type1; }
    }
}

ただし、VB.NETでは、 -keywordを使用して静的ローカル変数を使用することができます。Static

MustInherit Class Base
    Public MustOverride ReadOnly Property someArray() As Integer()
End Class

Class Derived
    Inherits Base
    Public Overrides ReadOnly Property someArray() As Integer()
        Get
            Static _someArray As Int32() = New Integer() {1, 2, 3, 4}
            Return _someArray
        End Get
    End Property
End Class

_someArrayのすべてのインスタンスで同じになりますDerived

于 2012-12-14T10:41:48.310 に答える