Re[8]: Порядок вызова конструкторов в C#
От: _FRED_ Черногория
Дата: 16.06.09 13:36
Оценка:
Здравствуйте, nikov, Вы писали:

GA>>При желании можно было бы сделать безопасно. Проанализировать, вызывается ли из конструктора конструктор предка — не более сложная задача, чем убедиться, что все пути функции вызывают return, а удобство от возможности вставить код до вызова конструктора очевидны.


N>Кстати, в IL и, насколько я помню, в Nemerle такое возможно.


И в VB.NET, кажется. но тогда все классы иерархии должны придерживаться некоторого соглашения о точке вызова конструктора предка, а кто это должен контролировать?
Help will always be given at Hogwarts to those who ask for it.
Re[12]: Порядок вызова конструкторов в C#
От: Jack128  
Дата: 16.06.09 13:44
Оценка:
Здравствуйте, _FRED_, Вы писали:

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



J>>Я пытался с мощью лямбд эту проблему решить:


_FR>В одной из версий фреймворка nikov обнаружил в подобном коде ошибку: компилиться всё компилилось, но верификацию не проходило. Потому что нечего пяткой к уху тянуться ;о)


да ладно, нормальный механизм был бы.

J>>непонял, кого нельзя объявить sealed ?? классы?


_FR>Тут я перепутал sealed и readonly. Если инициализацию полей проводить не в конструкторе, то полезная возможность иметь initonly поля идёт лесом.


А где инициализация проводится не в конструкторе? Все поля топик-стартера в конструкторе инициализируются.
Re[9]: Порядок вызова конструкторов в C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.06.09 13:59
Оценка:
Здравствуйте, _FRED_, Вы писали:

__FR>И в VB.NET, кажется. но тогда все классы иерархии должны придерживаться некоторого соглашения о точке вызова конструктора предка, а кто это должен контролировать?

Создатель класса. Иногда и ненужно его вызывать, так все действия может выполнить потомок.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Порядок вызова конструкторов в C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.06.09 14:17
Оценка:
Здравствуйте, _FRED_, Вы писали:

Скорее в Delphi Такой вариант
class Base : IInitializable
{

void Create()
{}

  protected virtual void InitializableCore() {
    Create();  }

  public Base() {
    InitializableCore();
  }
}

class Derived : Base
{
  protected override void InitializableCore() {
    Create()
  }
new void Create()
{
..........
base.Create();

}

}
и солнце б утром не вставало, когда бы не было меня
Re: Порядок вызова конструкторов в C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.06.09 12:56
Оценка:
Здравствуйте, GrigorievAnton
Можно так извратиться


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var v = new Base();
            var v2 = new Derived();

            v = new Base(1,2,3);
            v2 = new Derived(1, 2, 3);

            Console.ReadKey();
        }
    }
    class Base
    {

        protected virtual void AfterCreate()
        {
            Console.WriteLine("AfterCreate");

        }

        protected void Create(int x, int y, int z)
        {
            Console.WriteLine("Base");
            Console.WriteLine("x = {0} y = {1} z = {2}", x, y, z);

        }

        protected void Create()
        {
            Console.WriteLine("Base без параметров");


        }

        protected virtual void InitializableCore(int x, int y, int z)
        {
            Create(x, y, z);
            AfterCreate();
        }

        protected virtual void InitializableCore()
        {
            Create();
            AfterCreate();
        }

        public Base(int x, int y, int z)
        {
            InitializableCore(x, y, z);
        }

        public Base()
        {
            InitializableCore();
        }
    }

    class Derived : Base
    {
        protected override void InitializableCore(int x, int y, int z)
        {
            Create(x, y, z);
            AfterCreate();
        }

        protected override void InitializableCore()
        {
            Create();
            AfterCreate();
        }
        protected new void Create(int x, int y, int z)
        {
            Console.WriteLine("Derived");
            Console.WriteLine("x = {0} y = {1} z = {2}", x, y, z);
            base.Create(z, y, x);

        }

        protected new void Create()
        {
            Console.WriteLine("Derived без параметров");
            base.Create();

        }

        public Derived()
            : base()
        { }

        public Derived(int x, int y, int z)
            : base(x, y, z)
        { }
    }

}
и солнце б утром не вставало, когда бы не было меня
Re: Порядок вызова конструкторов в C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.06.09 06:26
Оценка:
Здравствуйте, GrigorievAnton, Вы писали:

Так попроще будет


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var v = new Base();
            var v2 = new Derived();

            v = new Base(1,2,3);
            v2 = new Derived(1, 2, 3);

            Console.ReadKey();
        }
    }
    class Base
    {

        protected virtual void AfterCreate()
        {
            Console.WriteLine("AfterCreate");
            Console.WriteLine("======================================");

        }

        protected virtual void Create(int x, int y, int z)
        {
            Console.WriteLine("Base");
            Console.WriteLine("x = {0} y = {1} z = {2}", x, y, z);

        }

        protected virtual void Create()
        {
            Console.WriteLine("Base без параметров");


        }

       

        public Base(int x, int y, int z)
        {
            Create(x, y, z);
            AfterCreate();
        }

        public Base()
        {
            Create();
            AfterCreate();
        }
    }

    class Derived : Base
    {
        
        protected override void Create(int x, int y, int z)
        {
            Console.WriteLine("Derived");
            Console.WriteLine("x = {0} y = {1} z = {2}", x, y, z);
            base.Create(z, y, x);

        }

        protected override void Create()
        {
            Console.WriteLine("Derived без параметров");
            base.Create();

        }

        public Derived()
            : base()
        { }

        public Derived(int x, int y, int z)
            : base(x, y, z)
        { }
    }

}
и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.