Информация об изменениях

Сообщение Re[6]: почему в C# до сих пор нет наследования конструкторов от 25.11.2022 16:08

Изменено 25.11.2022 16:12 vsb

Re[6]: почему в C# до сих пор нет наследования конструкторов
Здравствуйте, Sharov, Вы писали:

S>>>Ога, класс, особенно если something виртуальный метод.

νsb>>При чём тут это. Виртуальные методы нельзя вызывать, пока не вызвал конструктор базового объекта.

S>Если компилятор такое поймать сможет, то да, проблем нет, иначе -- хреново.


Сможет, конечно. Ну в жаве по крайней мере может.

Проблема возникает, когда нужно что-то не совсем тривиальное. К примеру в конструктор базового класса нужно передавать два параметра. И чтобы эти параметры вычислить, нужна еще пара строк, которые никакие виртуальные методы вызывать не будут, просто какие-то простые преобразования от параметров конструктора. Сейчас это в жаве никак не сделаешь, ну только вычислять это два раза в статическом методе, что смотрится очень некрасиво. Или заменить конструктор на статический метод, который будет конструировать объект, что тоже кажется некрасивым усложнением на ровном месте.

Условно:

Могло бы быть:
MyCtor(double d) {
  double a = atan(d);
  double s = sin(a);
  double c = cos(a);
  super(s, c);
}


А сейчас:

MyCtor(double d) {
  super(s(d), c(d));
}

private static double s(d) {
  double a = atan(d);
  return sin(a);
}

private static double c(d) {
  double a = atan(d);
  return cos(a);
}


или

private MyCtor(double s, c) {
  super(s, c);
}

public MyCtor of(double d) {
  double a = atan(d);
  double s = sin(a);
  double c = cos(a);
  return new MyCtor(s, c);
}
Re[6]: почему в C# до сих пор нет наследования конструкторов
Здравствуйте, Sharov, Вы писали:

S>>>Ога, класс, особенно если something виртуальный метод.

νsb>>При чём тут это. Виртуальные методы нельзя вызывать, пока не вызвал конструктор базового объекта.

S>Если компилятор такое поймать сможет, то да, проблем нет, иначе -- хреново.


Сможет, конечно. Ну в жаве по крайней мере может.

Проблема возникает, когда нужно что-то не совсем тривиальное. К примеру в конструктор базового класса нужно передавать два параметра. И чтобы эти параметры вычислить, нужна еще пара строк, которые никакие виртуальные методы вызывать не будут, просто какие-то простые преобразования от параметров конструктора. Сейчас это в жаве никак не сделаешь, ну только вычислять это два раза в статическом методе, что смотрится очень некрасиво. Или заменить конструктор на статический метод, который будет конструировать объект, что тоже кажется некрасивым усложнением на ровном месте.

Условно:

Могло бы быть:
MyCtor(double d) {
  double a = atan(d);
  double s = sin(a);
  double c = cos(a);
  super(s, c);
}


А сейчас:

MyCtor(double d) {
  super(s(d), c(d));
}

private static double s(d) {
  double a = atan(d);
  return sin(a);
}

private static double c(d) {
  double a = atan(d);
  return cos(a);
}


или

private MyCtor(double s, c) {
  super(s, c);
}

public static MyCtor of(double d) {
  double a = atan(d);
  double s = sin(a);
  double c = cos(a);
  return new MyCtor(s, c);
}