C# Проблема наследования классов с помощью простого калькулятора - PullRequest
0 голосов
/ 03 февраля 2020

Я новичок в C# и пытаюсь заставить мой второй класс, MyCalc2, унаследовать от MyCal c. Но я сталкиваюсь со следующим сообщением об ошибке в отношении MyCalc2:

Не указан аргумент, соответствующий необходимому формальному параметру 'x' из 'MyCal c .MyCal c (int, int, string). , string) '

Цель состоит в том, чтобы просто добавить другой класс, который наследуется от базового класса.

Я знаю, что мне нужно добавить что-то вроде' MyCal c: base (x ) к моему базовому классу, но я теряюсь в том, где разместить параметр (если это даже правильная вещь). Любое руководство будет оценено. Вот что у меня пока так:

    using System;
class MyCalc
{
    // class variable
    public int x;
    public int z;
    public string y;
    public string n;

    // constructor
    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;

    }
    // calculate the operations
    public int GetAdd()
    {
        return (this.x + this.z);

    }

    public int GetSubtract()
    { 
        return (this.x - this.z);
    }

    public int GetMultiply()
    {
        return (this.x * this.z);
    }

    public int GetDivide()
    {
        return (this.x / this.z);
    }

    public string GetYes()
    {
        return (this.y);
    }

    public string GetNo()
    {
        return (this.n);
    }

}

class MyCalc2:MyCalc //where the error is occurring 
{
    static void Main(string[] args)



    {
        bool repeat = false;
        do
        {

            repeat = false;


            int x = 0; int z = 0; string y; string n;
            Console.WriteLine("Enter the First Number");
            x = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Enter the Second Number");
            z = Convert.ToInt32(Console.ReadLine());



            //Using a switch statement to perform calculation:
            Console.WriteLine("Enter operator\r");
            switch (Console.ReadLine())


            {

                case "+":
                    Console.WriteLine($"The Answer is: {x} + {z} = " + (x + z));
                    break;

                case "-":
                    Console.WriteLine($"The Answer is: {x} - {z} = " + (x - z));
                    break;
                case "*":
                    Console.WriteLine($"The Answer is: {x} + {z} = " + (x + z));
                    break;

                case "/":
                    Console.WriteLine($"The Answer is: {x} - {z} = " + (x - z));
                    break;


            }



                //Repeat or Exit program using the do-while loop:

            string input = Console.ReadLine();
            Console.WriteLine("Do you want another operation(Y / N) ?");
            input = Console.ReadLine();
            repeat = (input.ToUpper() == "Y");

        }
            while (repeat);
            Console.WriteLine("Thanks for using our system.");
            Console.ReadKey();
        }

    }

Ответы [ 3 ]

0 голосов
/ 03 февраля 2020

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. По сути, у вас есть три варианта:

  1. Добавить конструктор к MyCalc (вы можете иметь столько конструкторов, сколько пожелаете, если параметры различаются), который не принимает параметров. Однако в этом случае значения уровня класса для MyCalc будут значениями по умолчанию. Вы должны были бы установить их явно после создания объекта. 1
  2. Добавить конструктор к MyCalc2, который принимает эти значения и передает их родительскому конструктору, или, по крайней мере, передает значение по умолчанию значения для родительского конструктора.
  3. Не используйте наследование здесь.

Честно говоря, в этом случае я бы go с третьим вариантом. Что такое наследование для достижения sh здесь? MyCalc2 не имеет смысла экземпляр MyCalc. Все, что он делает, это содержит начальную точку входа в приложение (метод Main), и это действительно все, что он должен делать.

Лог c в вашем методе Main должен создавать и использовать экземпляр MyCalc, но класс, имеющий этот метод Main, не должен пытаться быть экземпляром MyCalc. Это вызовет больше путаницы, чем решит какие-либо значимые проблемы.

1 Side Note: Поля классов Publi c исторически являются плохой привычкой в ​​объектно-ориентированном программировании. На эту тему много разговоров, и вы будете часто это видеть, продолжая свой опыт. Как правило, вы хотите, чтобы ваши объекты демонстрировали поведения , а не значения . Методы объекта выглядят несколько условно. В соглашениях C# рассматривается использование свойств (которые компилируются до самих методов, синтаксис просто семантически отличается). Вы можете иметь { get; set; } авто-свойства для самих значений и явные свойства только для чтения { get { /*...*/ } } для рассчитанных значений.

0 голосов
/ 03 февраля 2020

Вот возможное решение. Есть два класса MyClass, для калькулятора (вы можете переименовать его) и Propram. Программа содержит только метод Main, который запускает вашу программу. Это работает так, но остались некоторые ошибки. Я оставляю это вам, чтобы исправить их. За исключением того, что вы упускаете четкое понимание класса понятий и наследования, ваш код не так уж плох для новичка. Это почти работает.

using System;

namespace TestCalculator
  {
 class MyCalc
{
// class variable
public int x;
public int z;
public string y;
public string n;

// constructor
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;

  }
// calculate the operations
public int GetAdd()
  {
  return (this.x + this.z);

  }

public int GetSubtract()
  {
  return (this.x - this.z);
  }

public int GetMultiply()
  {
  return (this.x * this.z);
  }

public int GetDivide()
  {
  return (this.x / this.z);
  }

public string GetYes()
  {
  return (this.y);
  }

public string GetNo()
  {
  return (this.n);
  }

}
 class Program
{
static void Main(string[] args)
  {
  bool repeat = false;
  do
    {

    repeat = false;


    int x = 0; int z = 0; string y; string n;
    Console.WriteLine("Enter the First Number");
    x = Convert.ToInt32(Console.ReadLine());

    Console.WriteLine("Enter the Second Number");
    z = Convert.ToInt32(Console.ReadLine());



    //Using a switch statement to perform calculation:
    Console.WriteLine("Enter operator\r");
    switch (Console.ReadLine())


      {

      case "+":
        Console.WriteLine($"The Answer is: {x} + {z} = " + (x + z));
        break;

      case "-":
        Console.WriteLine($"The Answer is: {x} - {z} = " + (x - z));
        break;
      case "*":
        Console.WriteLine($"The Answer is: {x} + {z} = " + (x + z));
        break;

      case "/":
        Console.WriteLine($"The Answer is: {x} - {z} = " + (x - z));
        break;


      }



    //Repeat or Exit program using the do-while loop:

    string input = Console.ReadLine();
    Console.WriteLine("Do you want another operation(Y / N) ?");
    input = Console.ReadLine();
    repeat = (input.ToUpper() == "Y");

    }
  while (repeat);
  Console.WriteLine("Thanks for using our system.");
  Console.ReadKey();
  }
}

}

0 голосов
/ 03 февраля 2020

MyCalc2 не имеет способа инициализации MyCal c (базовый класс), поскольку в вашем базовом классе нет конструктора без параметров.

Решение:

  1. Добавить Конструктор без параметров в базовом классе
  2. Добавьте конструктор в производный класс, который может вызывать конструктор базового класса

, так как ваш код должен работать:

class MyCalc2 : MyCalc
{
    public MyCalc2 () : base(0, 0, "", "")
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...