Dan*_*dor 1 c# inheritance static-methods virtual-functions
首先让我们建立这个.
我有
public abstract class Foo
{
public static void StaticMethod()
{
}
}
public class Bar : Foo
{
}
Run Code Online (Sandbox Code Playgroud)
打电话有效吗?
Bar.StaticMethod();
Run Code Online (Sandbox Code Playgroud)
???
如果是这样,让我们展开前面的例子:
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!!!!");
}
}
Run Code Online (Sandbox Code Playgroud)
我应该如何在基类中构造StaticMethod,以便从派生类中使用VirtualMethod?我今天的咖啡因似乎太少/太多了,这里没有任何想法.
嗯,我知道我不能从静态方法调用实例方法.所以问题就出现了:
我可以从基类的静态方法创建派生类的实例.使用类似的东西:
public static void StaticMethod()
{
derived d=new derived();
d.VirtualMethod();
}
Run Code Online (Sandbox Code Playgroud)
为了说明的目的,我发明了新的关键字.
顺便说一句,我会赞成基于非反思的解决方案!
要从静态方法调用非静态方法,必须提供实例,因为静态方法未绑定 this
然后,在编辑之后,您的问题让我想到了C++中奇怪的重复出现的模板模式.
我从来没有尝试过在C#中使用它,但是你在这里看看,它会给你一些类似的东西:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
并"virtual from static!!!!"在控制台中打印出预期的消息.
| 归档时间: |
|
| 查看次数: |
1080 次 |
| 最近记录: |