Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 01.07.16 15:06
Оценка:
Всем привет!
Есть примерно такой код, который, естественно, не работает
    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# какой-нибудь паттерн, позволяющий реализовать аналогичное поведение?
Задача — запустить метод при создании объекта
Но внутри он должен использовать разные параметры от разных наследников
Спасибо...
Re: Аналог inherited (Delphi) в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.16 15:32
Оценка:
Здравствуйте, mDmitriy, Вы писали:
Можно использовать в конструкторах виртуальные методы. А вот там base можно вызывать хоть откуда
http://www.cyberforum.ru/csharp-net/thread857907.html
и солнце б утром не вставало, когда бы не было меня
Re[2]: Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 01.07.16 15:39
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, mDmitriy, Вы писали:

S>Можно использовать в конструкторах виртуальные методы. А вот там base можно вызывать хоть откуда
S>http://www.cyberforum.ru/csharp-net/thread857907.html
любой виртуальный метод, вызванный из базового конструктора, отработает (даже с наследной реализацией) до наследного конструктора
в чем и затык
Re[3]: Аналог inherited (Delphi) в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.16 15:44
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, mDmitriy, Вы писали:

S>>Можно использовать в конструкторах виртуальные методы. А вот там base можно вызывать хоть откуда
S>>http://www.cyberforum.ru/csharp-net/thread857907.html
D>любой виртуальный метод, вызванный из базового конструктора, отработает (даже с наследной реализацией) до наследного конструктора
D>в чем и затык
Если ты base в конструкторе то и базовый конструктор не будет вызываться
Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе
и солнце б утром не вставало, когда бы не было меня
Отредактировано 01.07.2016 15:56 Serginio1 . Предыдущая версия .
Re: Аналог inherited (Delphi) в C#?
От: _Raz_  
Дата: 01.07.16 16:09
Оценка: 3 (1)
Здравствуйте, 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;
        }
    }
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[4]: Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 01.07.16 16:23
Оценка:
Здравствуйте, Serginio1, Вы писали:
S>Если ты base в конструкторе то и базовый конструктор не будет вызываться
S> Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе
виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры
Re[5]: Аналог inherited (Delphi) в C#?
От: _Raz_  
Дата: 01.07.16 16:28
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры


    public abstract class A<TParam>
    {
        protected A(TParam param)
        {
            Start(param);
        }

        protected abstract void Start(TParam param);
    }

    public class B : A<int>
    {
        public B(int parameter) : base(parameter)
        {
        }

        #region Overrides of A

        protected override void Start(int param)
        {
            if (param != 0)
            {
            }
        }

        #endregion
    }
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[6]: Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 01.07.16 16:59
Оценка:
Здравствуйте, _Raz_, Вы писали:
D>>виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры

_R_>
_R_>    public abstract class A<TParam>
_R_>    {
_R_>

я думал об этом, но есть вариант без параметров и с разным их количеством
придется все сводить в какие-то спецструктуры или приводить внутри
плюс реальный класс и так обвешан темплейтами, не хочется плодить еще один
так что чересчур громоздко все это выйдет
Re[2]: Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 01.07.16 17:01
Оценка:
Здравствуйте, _Raz_, Вы писали:
_R_>
_R_>    public abstract class A
_R_>    {
_R_>        protected abstract void Start();

_R_>        public static TClass CreateAndStart<TClass>(Func<TClass> create) where TClass : A
_R_>        {
_R_>            var instance = create();
_R_>            instance.Start();
_R_>            return instance;
_R_>        }
_R_>    }
_R_>

Это сработало, спасибо
хотя уж больно извратный вызов получился
Re[5]: Аналог inherited (Delphi) в C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.16 17:46
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Serginio1, Вы писали:

S>>Если ты base в конструкторе то и базовый конструктор не будет вызываться
S>> Все зависит как ты в виртуальной функции вызовы расставишь. Все тоже что и inherited. Только тело инициализации проводишь в виртуальном методе
D>виртуальный метод по любому выполнится до дочернего конструктора... а у меня в нем параметры
Виртуальный метод выполнится до того как ты сам укажешь. Он выполняется вне конструктора, но вызывается в конструкторе
И в нем ты можешь варьировать вызовом виртуального метода базового класса в отличие от конструктора
и солнце б утром не вставало, когда бы не было меня
Re[3]: Аналог inherited (Delphi) в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 01.07.16 19:45
Оценка: +4
Здравствуйте, mDmitriy, Вы писали:

D>хотя уж больно извратный вызов получился


Извратно прежде всего звать виртуальные методы в конструкторе.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Аналог inherited (Delphi) в C#?
От: DarthSidius  
Дата: 02.07.16 05:40
Оценка:
Здравствуйте, 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
    }
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 58>>
♠♠♥♠♠♦♥
Re[4]: Аналог inherited (Delphi) в C#?
От: mDmitriy Россия  
Дата: 02.07.16 06:11
Оценка:
Здравствуйте, AndrewVK, Вы писали:
D>>хотя уж больно извратный вызов получился
AVK>Извратно прежде всего звать виртуальные методы в конструкторе.
согласен... и Решайпер о том же напоминает
но я привел демонстрационный пример
в реальном коде у меня вызов абстрактного метода обернут в приватный, который дергается из конструктора
что никак не решает мою проблему и не отменяет извратности вызова
Re[5]: Аналог inherited (Delphi) в C#?
От: hardcase Пират http://nemerle.org
Дата: 04.07.16 20:39
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

D>в реальном коде у меня вызов абстрактного метода обернут в приватный, который дергается из конструктора

D>что никак не решает мою проблему и не отменяет извратности вызова

Сути это не меняет, и на лицо двухэтапная инициализация. Проблема решается фабрикой или билдером, которые выполнят необходимую инициализацию после изготовления экземпляра.
/* иЗвиНите зА неРовнЫй поЧерК */
Отредактировано 04.07.2016 20:39 hardcase . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.