我被这个问题解决了太多次,所以我决定分享一下,看看你们的想法,让我们看看下面的(愚蠢的)例子:
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!
}
}
在这个例子中,我们为哈希函数未知的哈希表提供了一些奇怪的实现,以及具有预定义哈希函数的整数哈希表的特殊类,请注意,这里我们需要再次组合哈希表 n 的非静态大小和基础c'tor...