문제

먼저 이것을 설정합시다.

나는 가지고있다

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

예?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top