2009-12-07 3 views
1

Сначала давайте установим это.Вызов виртуальных методов потомков из статического метода

Я

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

Я изобрел новое ключевое слово, полученное, с целью иллюстрации.

BTW, я буду предлагать решение без отражения здесь!

ответ

6

Для вызова нон статического метода из статического метода, вы должны предоставить экземпляр как статический метод не связан с 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!!!!" сообщение в консоли.

+0

Я знаю, что, конечно, проверьте мою модификацию вопроса. –

+0

Конечно, вы можете вызывать нестатические методы из статического метода. Вам просто нужно предоставить экземпляр. –

+0

@ Эрик да, цель OP не была очевидна до того, как вопрос был отредактирован, поэтому мой первый базовый ответ –

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

Да?

+0

@ Эрик: Если я call Bar.StaticMethod() Я бы хотел, чтобы этот метод во время выполнения имел контекст Bar вместо контекста Foo, поэтому он может получить экземпляр объекта из него и выполнить на нем VirtualMethod. –

+0

@ Эрик: Мне нравится статический метод Foo для вызова публичного конструктора Bar или Bar2 или любого другого класса потомков, в зависимости от контекста, в котором вызывается. т.е. Bar.StaticMethod() должен создать экземпляр Bar и Bar2.StaticMethod - экземпляр Bar2 ... –

+0

@ Эрик: Я хотел бы назвать Bar.DoBlah(); Поэтому DoBlah() будет вести себя как полиморфная оболочка вокруг виртуального метода экземпляра класса. –

Смежные вопросы