首先让我们建立这个。
我有
public abstract class Foo
{
public static void StaticMethod()
{
}
}
public class Bar : Foo
{
}
调用
是否有效Bar.StaticMethod();
???
如果是这样,让我们展开前面的例子:
public abstract class Foo
{
public static void StaticMethod()
{
}
public abstract void VirtualMethod();
}
public class Bar : Foo
{
public override void VirtualMethod()
{
Trace.WriteLine("virtual from static!!!!");
}
}
我应该如何在基类中构造StaticMethod,以便从派生类中使用VirtualMethod?我今天的咖啡因似乎太少/太多了,这里没有任何想法。
嗯,我知道我无法从静态方法调用实例方法。所以问题就出现了:
我可以从基类的静态方法创建派生类的实例。通过使用类似的东西:
public static void StaticMethod()
{
derived d=new derived();
d.VirtualMethod();
}
为了说明的目的,我发明了新的关键字。
顺便说一句,我会赞成基于非反思的解决方案!答案 0 :(得分:6)
要从静态方法调用非静态方法,必须提供实例,因为静态方法未绑定到this
然后,在您编辑之后,您的问题让我想到了C ++中的curiously recurring template pattern。
我从未尝试过在C#中使用它,但你看看here,这会给你类似的东西:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication3
{
public abstract class Foo<T> where T : Foo<T>, new()
{
public static void StaticMethod()
{
T t = new T();
t.VirtualMethod();
}
public abstract void VirtualMethod();
}
public class Bar : Foo<Bar>
{
public override void VirtualMethod()
{
System.Console.WriteLine("virtual from static!!!!");
}
}
class Program
{
static void Main(string[] args)
{
Bar.StaticMethod();
}
}
}
并在控制台中打印出预期的"virtual from static!!!!"
消息。
答案 1 :(得分:4)
调用Bar.StaticMethod(); ???
是有效的
是的,调用Bar.StaticMethod是合法的,只是表现得好像你调用了Foo.StaticMethod。
我可以从基类的静态方法创建派生类的实例。
好的,我想我明白你想要什么。你想调用一个静态方法并让它创建一个ARBITRARY派生类的实例,然后在该类上调用一个方法,是吗?
使用泛型。
abstract class Foo
{
public static void DoBlah<T>() where T : Foo, new()
{
T t = new T();
t.Blah();
}
public abstract void Blah();
}
class Bar : Foo
{
public Bar() {}
public override void Blah() {}
}
...
Foo.DoBlah<Bar>();
是