我想要一些类,它们都扩展一个基本抽象类。
然后,我希望每个对象都存储这些类的子集并调用它们实现的方法。
所以我想 - 我对存储的对象不执行任何操作,所以让我们将这些类设为静态,这样我就不会在存储对象上浪费内存,只需引用静态类,这样我就可以调用静态函数。问题是 - 我该怎么做?
对于那些喜欢代码的人,这是我需要的:
public static abstract class A {
public static abstract void F();
}
public static class B : A {
public static override void F() {
...
}
}
// Class Storage of course does NOT work, its just here to illustrate what I need
public class Storage {
private List<A> list;
public void AddElement(A element) {
list.Add(element);
}
public void DoStuff() {
foreach(A element in list)
element::F();
}
}
有什么办法可以做到类似的事情吗?或者针对此类问题的不同解决方案?
最佳答案
不,你不能那样做。您尝试执行的操作存在许多问题:
- 您不能使用静态类型作为类型参数,例如
List<A>
。 - 您不能使用静态类型作为方法参数,例如
AddElement(A element)
. - 您不能将静态类型抽象化,因为无法继承它。
- 即使在非静态类中也不能将静态方法抽象化,因为它无法被重写。
从您描述问题的方式来看,我认为这里不需要静态类型或静态方法。只需创建一个简单的抽象类并从中继承即可:
public abstract class A {
public abstract void F();
}
public class B : A {
public override void F() {
...
}
}
public class Storage {
private List<A> list;
public void AddElement(A element) {
list.Add(element);
}
public void DoStuff() {
foreach(A element in list)
element.F();
}
}
或者,您可以创建 List<Type>
并使用反射来调用这些类型的静态方法。例如:
public static class A {
public static void F() { ... }
}
public static class B {
public static void F() { ... }
}
List<Type> typeList = new List<Type> { typeof(A), typeof(B) };
foreach(var type in typeList)
{
type.GetMethod("F").Invoke(null, null);
}
但是使用反射会比使用直接方法调用慢,并且您将失去此方法的所有类型安全性(除非您自己编写类型检查)。
关于c# - C# 中的静态类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976807/