MyCalc2
не имеет явного конструктора. Это означает, что у него есть только один неявный конструктор , который не принимает аргументов и не устанавливает значений. Если сделать это явно, это будет выглядеть так:
public MyCalc2()
{
}
Однако, MyCalc
имеет явный конструктор. Это означает, что он имеет неявный конструктор no . И его конструктор принимает аргументы:
public MyCalc(int x, int z, string y, string n)
{
this.x = x; // assign the parameter passed to the class variable
this.z = z;
this.y = y;
this.n = n;
}
Поэтому, когда вы создаете экземпляр MyCalc2
, он не может предоставить значения MyCalc
. По сути, у вас есть три варианта:
- Добавить конструктор к
MyCalc
(вы можете иметь столько конструкторов, сколько пожелаете, если параметры различаются), который не принимает параметров. Однако в этом случае значения уровня класса для MyCalc
будут значениями по умолчанию. Вы должны были бы установить их явно после создания объекта. 1 - Добавить конструктор к
MyCalc2
, который принимает эти значения и передает их родительскому конструктору, или, по крайней мере, передает значение по умолчанию значения для родительского конструктора. - Не используйте наследование здесь.
Честно говоря, в этом случае я бы go с третьим вариантом. Что такое наследование для достижения sh здесь? MyCalc2
не имеет смысла экземпляр MyCalc
. Все, что он делает, это содержит начальную точку входа в приложение (метод Main
), и это действительно все, что он должен делать.
Лог c в вашем методе Main
должен создавать и использовать экземпляр MyCalc
, но класс, имеющий этот метод Main
, не должен пытаться быть экземпляром MyCalc
. Это вызовет больше путаницы, чем решит какие-либо значимые проблемы.
1 Side Note: Поля классов Publi c исторически являются плохой привычкой в объектно-ориентированном программировании. На эту тему много разговоров, и вы будете часто это видеть, продолжая свой опыт. Как правило, вы хотите, чтобы ваши объекты демонстрировали поведения , а не значения . Методы объекта выглядят несколько условно. В соглашениях C# рассматривается использование свойств (которые компилируются до самих методов, синтаксис просто семантически отличается). Вы можете иметь { get; set; }
авто-свойства для самих значений и явные свойства только для чтения { get { /*...*/ } }
для рассчитанных значений.