Сообщение Re[6]: почему в C# до сих пор нет наследования конструкторов от 25.11.2022 16:08
Изменено 25.11.2022 16:11 vsb
Re[6]: почему в C# до сих пор нет наследования конструкторов?
Здравствуйте, Sharov, Вы писали:
S>>>Ога, класс, особенно если something виртуальный метод.
νsb>>При чём тут это. Виртуальные методы нельзя вызывать, пока не вызвал конструктор базового объекта.
S>Если компилятор такое поймать сможет, то да, проблем нет, иначе -- хреново.
Сможет, конечно. Ну в жаве по крайней мере может.
Проблема возникает, когда нужно что-то не совсем тривиальное. К примеру в конструктор базового класса нужно передавать два параметра. И чтобы эти параметры вычислить, нужна еще пара строк, которые никакие виртуальные методы вызывать не будут, просто какие-то простые преобразования от параметров конструктора. Сейчас это в жаве никак не сделаешь, ну только вычислять это два раза в статическом методе, что смотрится очень некрасиво.
Условно:
Могло бы быть:
А сейчас:
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);
}
Re[6]: почему в C# до сих пор нет наследования конструкторов
Здравствуйте, Sharov, Вы писали:
S>>>Ога, класс, особенно если something виртуальный метод.
νsb>>При чём тут это. Виртуальные методы нельзя вызывать, пока не вызвал конструктор базового объекта.
S>Если компилятор такое поймать сможет, то да, проблем нет, иначе -- хреново.
Сможет, конечно. Ну в жаве по крайней мере может.
Проблема возникает, когда нужно что-то не совсем тривиальное. К примеру в конструктор базового класса нужно передавать два параметра. И чтобы эти параметры вычислить, нужна еще пара строк, которые никакие виртуальные методы вызывать не будут, просто какие-то простые преобразования от параметров конструктора. Сейчас это в жаве никак не сделаешь, ну только вычислять это два раза в статическом методе, что смотрится очень некрасиво. Или заменить конструктор на статический метод, который будет конструировать объект, что тоже кажется некрасивым.
Условно:
Могло бы быть:
А сейчас:
или
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);
}