Перенаправить конструктор без аргументов в базовый класс ctor с аргументом - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь создать класс Bar , который расширяет класс Foo . Код Foo находится вне моего контроля.

Когда кто-то создает новый экземпляр Bar (записывая что-то вроде Bar x = new Bar (); ), я хочу, чтобы это инициировало вызов Foo конструктор, который принимает входной аргумент.

В основном:

class Foo {
    public Foo(string message) { print("The new Foo says: " + message); }
}

class Bar : Foo {
    public Bar() : base(this.GetType()) { }
}

Поэтому, когда кто-то использует new Bar () , он должен распечатать Новый Foo говорит: Bar . (Предполагая, что есть функция print , что здесь не главное.)

Вместо этого C # жалуется, потому что я пытаюсь вычислить результат в аргументах базового конструктора.

Помните, Foo вне моей досягаемости, поэтому я не могу изменить код в Foo .

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Вы не можете использовать this перед фактическим конструктором класса, поскольку в этом контексте доступны только параметры и статические члены (так как конструктор static запускается до любых нестатических). Среда выполнения сначала должна создать любые классы, от которых вы наследуете, прежде чем вы сможете получить доступ к this.

В качестве обходного пути вы можете использовать оператор typeof:

class Bar : Foo {
    public Bar() : base(typeof(Bar).ToString()) { }
}

Конечно, это не портативно, но, вероятно, это лучшее, что вы сможете придумать.

1 голос
/ 01 ноября 2011

this.GetType() не будет работать в качестве процедуры инициализации.

Вы не можете выполнить код, который передается в базовый класс, но зависит от текущего экземпляра. Это логично, так как конструктор базового класса выполняется first .

Однако, если вы передаете тип, вы можете использовать typeof вместо GetType().

Следующий код работает и корректно компилируется:

namespace TestNamespace
{
    using System;

    public class Test
    {
        public static void Main()
        {
            var foo = new Bar();
            Console.ReadKey();
        }
    }

    class Foo
    {
        public Foo(Type type) { Console.WriteLine("The type of Foo is: " + type.ToString()); }
    }

    class Bar : Foo
    {
        public Bar() : base(typeof(Bar)) { }
    }
}

После выполнения вывод на консоль:

Тип Foo: TestNamespace.Bar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...