c# - C# 中的静态类列表

标签 c# oop inheritance static-methods static-classes

我想要一些类,它们都扩展一个基本抽象类。

然后,我希望每个对象都存储这些类的子集并调用它们实现的方法。

所以我想 - 我对存储的对象不执行任何操作,所以让我们将这些类设为静态,这样我就不会在存储对象上浪费内存,只需引用静态类,这样我就可以调用静态函数。问题是 - 我该怎么做?

对于那些喜欢代码的人,这是我需要的:

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();
    }
}

有什么办法可以做到类似的事情吗?或者针对此类问题的不同解决方案?

最佳答案

不,你不能那样做。您尝试执行的操作存在许多问题:

  1. 您不能使用静态类型作为类型参数,例如List<A>
  2. 您不能使用静态类型作为方法参数,例如AddElement(A element) .
  3. 您不能将静态类型抽象化,因为无法继承它。
  4. 即使在非静态类中也不能将静态方法抽象化,因为它无法被重写。

从您描述问题的方式来看,我认为这里不需要静态类型或静态方法。只需创建一个简单的抽象类并从中继承即可:

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/

相关文章:

c# - asp.net下的Process.Start()?

c# - 在 C# 的另一个进程内存中搜索特定字符串(或字节数组)的快速方法?

c# - 在 ASP.NET Core 中自动生成小写虚线路由

java - 重写而不调用父方法,违反了里氏原则

c# - Entity Framework - 如何将测试数据播种到使用每类型表继承的实体?

c++ - 如何声明任何继承类的实例?

c# - 使用对数刻度向图表添加空点

java - 将唯一的对象实例添加到 ArrayList 中

java - 如何在Achartengine(Android)中分离主代码和图表代码

database - 类图是否显示数据库结构?