私はこの問題に何度も取り組んできたので、皆さんの意見を共有して確認することにしました。次の(ばかげた)例を見てみましょう。
public delegate void ToRun();
class Runner {
ToRun tr;
public Runner(ToRun f) {
tr=f;
}
public void run() {
tr();
}
}
class CountingRunner : Runner {
ToRun tr;
int i;
public CountingRunner(ToRun f) : base(f+=inc) {
i=0;
}
private static void inc() {
i++; //COMPILATION ERROR - i is not (and logically cannot be) static!
}
}
さて、私が聞きたいのは:
Q1 : なぜ base() パラメータは静的でなければならないのですか?
Q2 : 私の例のように、非静的フィールドまたはメソッドを基本コンストラクターの呼び出しと組み合わせたい場合はどうなりますか? それを行うための最もOOPの方法は何ですか?
注:「ベースc'torを使用しないでください」などの一時的な解決策を提供しないようにしてください。ベースの使用が避けられない、より複雑な状況が発生する可能性があるため、合理的に適切に設計されたソリューションを探しています。
ありがとう!
更新:私の例はクラックするのが簡単すぎたので、十分に学んでいないように感じるので、別の(まだかなりばかげた)例を挙げてみましょう:
public delegate int HashFunc<E>(E e);
public interface HashTable<E> {
void insert(E e);
bool isMember(E e);
}
class HashArray<E> : HashTable<E> where E : IComparable<E> {
private E[] a;
private bool[] taken;
public readonly int n;
public int size {
get { return n; }
}
HashFunc<E> hash;
public HashArray(int m , HashFunc<E> hash ) {
n=2*m;
a=new E[n];
taken=new bool[n];
for (int i=0 ; i<n ; i++) taken[i]=false;
this.hash=hash;
}
public void insert(E e) {
int index=hash(e),i;
for (i=index ; i<n && taken[i]!=false ; ++i) ;
if (i>=n)
for (i=0 ; i<index && taken[i]!=false ; ++i) ;
if (i>=index) return;
taken[i]=true;
a[i]=e;
}
public bool isMember(E e) {
int i=hash(e);
for ( ; i<n && taken[i]!=false && a[i].CompareTo(e)!=0 ; ++i );
if (i>=n || taken[i]==false) return false;
return true;
}
}
class HashArrayInt : HashArray<int> {
public HashArrayInt(int n) : base (n,HashFunc) {
}
public static int HashFunc(int i) {
return (i%n);// n is a non static field, every hash table has its own size!
}
}
この例では、ハッシュ関数が不明なハッシュ テーブルの奇妙な実装と、事前定義されたハッシュ関数を持つ int のハッシュ テーブルの特別なクラスを提供しています。ここでも、ハッシュ テーブルの非静的サイズ n を組み合わせる必要があることに注意してください。そしてベースセンター...