Здравствуйте, mDmitriy, Вы писали:
D>Но очень хочется...
public abstract class A
{
protected abstract void Start();
public static TClass CreateAndStart<TClass>(Func<TClass> create) where TClass : A
{
var instance = create();
instance.Start();
return instance;
}
}
Здравствуйте, mDmitriy, Вы писали:
D>в реальном коде у меня вызов абстрактного метода обернут в приватный, который дергается из конструктора D>что никак не решает мою проблему и не отменяет извратности вызова
Сути это не меняет, и на лицо двухэтапная инициализация. Проблема решается фабрикой или билдером, которые выполнят необходимую инициализацию после изготовления экземпляра.
Всем привет!
Есть примерно такой код, который, естественно, не работает
public abstract class A
{
protected A()
{
Start();
}
protected abstract void Start();
}
public class B : A
{
private readonly int _parameter;
public B(int parameter)
: base()
{
_parameter = parameter;
}
#region Overrides of A
protected override void Start()
{
if(_parameter != 0)
{
// всегда 0, ибо инициализация еще не наступила
}
}
#endregion
}
Но очень хочется...
В Delphi есть ключевое слово inherited, позволяющее вызывать базовый конструктор из любого места в конструкторе наследника
Есть ли в C# какой-нибудь паттерн, позволяющий реализовать аналогичное поведение?
Задача — запустить метод при создании объекта
Но внутри он должен использовать разные параметры от разных наследников
Спасибо...
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, mDmitriy, Вы писали: S>Можно использовать в конструкторах виртуальные методы. А вот там base можно вызывать хоть откуда S>http://www.cyberforum.ru/csharp-net/thread857907.html
любой виртуальный метод, вызванный из базового конструктора, отработает (даже с наследной реализацией) до наследного конструктора
в чем и затык
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, mDmitriy, Вы писали: S>>Можно использовать в конструкторах виртуальные методы. А вот там base можно вызывать хоть откуда S>>http://www.cyberforum.ru/csharp-net/thread857907.html D>любой виртуальный метод, вызванный из базового конструктора, отработает (даже с наследной реализацией) до наследного конструктора D>в чем и затык
Если ты base в конструкторе то и базовый конструктор не будет вызываться
Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали: S>Если ты base в конструкторе то и базовый конструктор не будет вызываться S> Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе
виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры
Здравствуйте, _Raz_, Вы писали: D>>виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры
_R_>
_R_> public abstract class A<TParam>
_R_> {
_R_>
я думал об этом, но есть вариант без параметров и с разным их количеством
придется все сводить в какие-то спецструктуры или приводить внутри
плюс реальный класс и так обвешан темплейтами, не хочется плодить еще один
так что чересчур громоздко все это выйдет
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Serginio1, Вы писали: S>>Если ты base в конструкторе то и базовый конструктор не будет вызываться S>> Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе D>виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры
Виртуальный метод выполнится до того как ты сам укажешь. Он выполняется вне конструктора, но вызывается в конструкторе
И в нем ты можешь варьировать вызовом виртуального метода базового класса в отличие от конструктора
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, mDmitriy, Вы писали:
D>Но очень хочется... D>В Delphi есть ключевое слово inherited, позволяющее вызывать базовый конструктор из любого места в конструкторе наследника D>Есть ли в C# какой-нибудь паттерн, позволяющий реализовать аналогичное поведение? D>Задача — запустить метод при создании объекта D>Но внутри он должен использовать разные параметры от разных наследников D>Спасибо...
Переходи на Nemerle
public abstract class A
{
protected this()
{
Start()
}
protected abstract Start() : void;
}
public class B : A
{
_parameter : int;
public this(parameter : int)
{
_parameter = parameter;
base()
}
#region Overrides of A
protected override Start() : void
{
when(_parameter != 0)
{
// инициализация наступила
}
}
#endregion
}
Здравствуйте, AndrewVK, Вы писали: D>>хотя уж больно извратный вызов получился AVK>Извратно прежде всего звать виртуальные методы в конструкторе.
согласен... и Решайпер о том же напоминает
но я привел демонстрационный пример
в реальном коде у меня вызов абстрактного метода обернут в приватный, который дергается из конструктора
что никак не решает мою проблему и не отменяет извратности вызова