Как передать параметры в конструктор наследуемой программы класса? - PullRequest
0 голосов
/ 25 февраля 2020

это мой код в чем ошибка? и как это решить. Как уже говорилось, конструктор является методом, и он не будет содержать никакого возвращаемого типа. Если мы хотим создать конструктор в c#, то нам нужно создать метод, имя которого совпадает с именем класса.

class Program
    {
        public static int number;
        public static string name;
        public static float salary = 20000;
        static void Main(string[] args)
        {

            Console.WriteLine("Welcome");
            Console.WriteLine("Enter Your Name: ");
            name = Console.ReadLine();
            Employee System = new Employee("Sameed", 20000f);
            Bonus b1 = new Bonus();
            //b1.Employee(name, salary);
            b1.Salary(salary);
            b1.Bonuses();
            Display(number);
            Display(name,number);
    }
    static void Display(int n)
{

    Console.WriteLine("Employee Number is: " +n);
}
    static void Display(string name, int num)
{
    Console.WriteLine("Congratulations {0}, your Employee number has been generated {1}",name,num);
}
}
public class Employee
{
    public Employee(string n, float s)
    {
        Console.WriteLine("Hello Mr. {0}, Your Salary is {1}", n, s);
    }
}
public class Director:Employee
{
    public void Salary(float s)
    {
        Console.WriteLine("Your Salary is: " + s);
    }
}
    public class Bonus:Director
    {
        public void Bonuses()
        {

            int bonus = 40000;
            Console.WriteLine("Your Bonus is: " + bonus);
        }
    }

Ошибка: Employee 'не содержит конструктор, который принимает 0 аргументов

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Поскольку класс Director наследует класс Employee, он должен использовать конструктор базового класса для создания фактического экземпляра. Итак, в вашем коде вы также добавляете конструктор к классу Director и вызываете конструктор базового класса, вот так:

public Director(string n, float s) : base(n, s)
{
}

Без этого компилятора вы получите ошибку

error CS7036: Отсутствует аргумент, соответствующий необходимому формальному параметру

То же самое следует сделать для Bonus class

public Bonus(string n, float s) : base(n, s)
{
}

Создание экземпляра Bonus будет следующие

Bonus b1 = new Bonus(name, salary);

Посмотрите на конструкторы экземпляров и , используя конструкторы article. Образец во второй статье очень близок к коду OP

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

Любой унаследованный конструктор класса должен передавать необходимые параметры в базу. Таким образом, publi c Director: base (обязательные значения здесь). Если вы не хотите передавать значения конструктору Director, вы можете это сделать. Однако вы все равно должны передать что-то базовому классу. Например:

using System;

public class Program
{
    public static void Main()
    {
        var bob = new Director("Bob");
        Console.WriteLine(bob.Salary);

    }
}

public class Employee
{
    public string Name {get;set;}
    public float Salary {get;set;}

    public Employee(string name, float salary)
    {
        Name = name;
        Salary = salary;
    }
}

public class Director : Employee
{
    public Director(string name) : base (name, 250000)
    {

    }
}

Как указывалось в предыдущих ответах, лучше использовать более описательные переменные, и нет смысла наследовать Employee / Director to Bonus. Сотрудник имеет бонус. Конечно, я считаю некоторых сотрудников бонусом:)

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

Итак, ваш Director является Employee. И Employee может быть создан только с 2 значениями - name и salary. Следовательно, поскольку ваш Director является Employee, это означает, что к нему применяется то же правило - у него есть для имени и зарплаты.

Исправление заключается в вызове base конструктор на Director - то есть вызов конструктора Employee.

"Как мне это сделать?" Я слышал, вы спрашиваете. Ну, со специальным base звонком:

public class Employee
{
    public Employee(string n, float s)
    {
        Console.WriteLine("Hello Mr. {0}, Your Salary is {1}", n, s);
    }
}

public class Director : Employee
{
    public void Salary(string name, float salary)
        : base(name, salary) // Make sure you include this line
    {
        Console.WriteLine("Your Salary is: " + s);
    }
}

Но подождите, это еще не все!

Я также хотел бы высказать несколько предложений относительно вашего кода.

1) Пожалуйста, используйте более длинные имена переменных: name и salary намного чище, чем n и s.

2) Вы наследуете Bonus от Director. Наследование - это отношение is-a. Таким образом, утверждение «Директор - это сотрудник» имеет полный смысл, а утверждение «Бонус - это директор» - нет (если вы не используете «Бонус» в очень необычном смысле). Если вы не можете сказать, что что-то - это что-то иначе наследование не является правильным подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...