gpt4 book ai didi

c# - 从静态方法调用后代虚拟方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:54 27 4
gpt4 key购买 nike

首先让我们确定这一点。

我有

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

为了说明的目的,我发明了新的关键字,派生。

顺便说一句,我会在这里支持基于非反射的解决方案!

最佳答案

要从静态方法调用非静态方法,您必须提供一个实例,因为静态方法未绑定(bind)到 this
然后,在您编辑之后,您的问题让我想到了 curiously recurring template pattern在 C++ 中。

我从未尝试过自己在 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!!!!"控制台中的消息。

关于c# - 从静态方法调用后代虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1860767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com