정적 방법에서 자손 가상 방법을 호출합니다
-
13-09-2019 - |
문제
먼저 이것을 설정합시다.
나는 가지고있다
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!!!!");
}
}
파생 클래스에서 VirtualMethod를 사용할 수 있도록 기본 클래스에서 정적 메드를 어떻게 구성해야합니까? 오늘은 너무 작거나 너무 많은 카페인이 있었는데 여기서 아무것도 내 마음에 오지 않습니다.
HM, 정적 메소드에서 인스턴스 메소드를 호출 할 수 없다는 것을 알고 있습니다. 따라서 질문은 다음과 같습니다.
정적베이스 클래스의 정적 메소드에서 파생 클래스 인스턴스를 만들 수 있습니까? 다음과 같은 것을 사용하여
public static void StaticMethod()
{
derived d=new derived();
d.VirtualMethod();
}
나는 그림의 목적으로 도출 된 새로운 키워드를 발명했습니다.
BTW, 나는 여기서 비 반사 기반 솔루션을 선호 할 것입니다!
해결책
정적 메소드에서 비 정적 메소드를 호출하려면 정적 메소드가 바인딩되지 않으므로 인스턴스를 제공해야합니다. 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();
}
}
}
의도 한 것을 인쇄합니다 "virtual from static!!!!"
콘솔의 메시지.
다른 팁
bar.staticMethod (); ???를 호출하는 것이 유효합니까?
예, Bar.staticMethod를 호출하는 것은 합법적이며 단순히 Foo.staticMethod라고 불리는 것처럼 행동합니다.
정적베이스 클래스의 정적 메소드에서 파생 클래스 인스턴스를 만들 수 있습니까?
좋아, 나는 당신이 원하는 것을 이해한다고 생각합니다. 정적 메소드를 호출하고 임의의 파생 클래스의 인스턴스를 만들고 해당 클래스에서 메소드를 호출하려고합니다.
제네릭을 사용하십시오.
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>();
예?