Здравствуйте, nikov, Вы писали:
GA>>При желании можно было бы сделать безопасно. Проанализировать, вызывается ли из конструктора конструктор предка — не более сложная задача, чем убедиться, что все пути функции вызывают return, а удобство от возможности вставить код до вызова конструктора очевидны.
N>Кстати, в IL и, насколько я помню, в Nemerle такое возможно.
И в VB.NET, кажется. но тогда все классы иерархии должны придерживаться некоторого соглашения о точке вызова конструктора предка, а кто это должен контролировать?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Jack128, Вы писали:
J>>Я пытался с мощью лямбд эту проблему решить:
_FR>В одной из версий фреймворка nikov обнаружил в подобном коде ошибку: компилиться всё компилилось, но верификацию не проходило. Потому что нечего пяткой к уху тянуться ;о)
да ладно, нормальный механизм был бы.
J>>непонял, кого нельзя объявить sealed ?? классы?
_FR>Тут я перепутал sealed и readonly. Если инициализацию полей проводить не в конструкторе, то полезная возможность иметь initonly поля идёт лесом.
А где инициализация проводится не в конструкторе? Все поля топик-стартера в конструкторе инициализируются.
Здравствуйте, _FRED_, Вы писали:
__FR>И в VB.NET, кажется. но тогда все классы иерархии должны придерживаться некоторого соглашения о точке вызова конструктора предка, а кто это должен контролировать?
Создатель класса. Иногда и ненужно его вызывать, так все действия может выполнить потомок.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, 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)
{ }
}
}
и солнце б утром не вставало, когда бы не было меня
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)
{ }
}
}
и солнце б утром не вставало, когда бы не было меня