Как передать значение из унаследованного класса в C # - PullRequest
0 голосов
/ 23 сентября 2018

По некоторым причинам, когда я пытаюсь получить доступ к общедоступному свойству из унаследованного класса, он возвращает 0. Вот мой код.Когда я печатаю savings.AccountBalance, я получаю 0. Что я делаю не так?Я хотел бы использовать свойства из унаследованного класса или использовать его переменные.Я не хочу, чтобы переменные были общедоступными, поэтому мне придется изменить их на protected вместо private.

class AccountTest
{
    static void Main ( string[] args )
    {
        Account account = new Account ();    //declaring account object
        SavingsAccount savings = new SavingsAccount ();
        Console.Write ( "Enter account balance: " );
        account.AccountBalance = Convert.ToDecimal ( Console.ReadLine () );
        Console.WriteLine ( "Enter Interest rate in percentage: " );
        savings.Interest = Convert.ToInt32 ( Console.ReadLine () );
        Console.WriteLine ( $"Account Balance: {account.Balance}\nInterest rate: {savings.interest}\n" +
                           $"Savings Earned Interest: {savings.CalculateInterest()}" );
    }
}

Второй класс

class Account
{
    private decimal accountBalance;
    public Account () { }
    public Account ( decimal balance )
    {
        AccountBalance = balance;
    }
    public decimal AccountBalance
    {
        get
        {
            return accountBalance;
        }
        set
        {
            if (value < 0)
            {
                Console.WriteLine ( "Account balance cannot be negative number" );
            }
            else
            {
                accountBalance = value;
            }
        }
    }
    public decimal Balance
    {
        get
        {
            return accountBalance;
        }
    }
}

А вот и мой последний класс.Почему метод CalculateInterest возвращает 0?

class SavingsAccount : Account
{
    public double interest;
    public SavingsAccount () : base () { }
    public SavingsAccount ( decimal initialBalance ) : base ( initialBalance )
    {
        initialBalance = AccountBalance;
    }
    public SavingsAccount ( double interests )
    {
        interests = Interest;
    }
    public double Interest
    {
        get
        {
            return interest;
        }
        set
        {
            if (value >= 0)
            {
                interest = value;
            }
            else
            {
                Console.WriteLine ( "Interest Cannot be Negative" );
            }
        }
    }
    public decimal CalculateInterest () => 
        Balance * Convert.ToDecimal ( interest / 100 );
}

Это обновленная версия моего предыдущего вопроса.

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вы объявили Свойство getId в своем классе Employee, ведьма инициализируется с нулевым значением по умолчанию.Вот почему empId будет также инициализироваться с нуля.Ваше поле id также никогда не инициализируется и никогда не используется.Если вы имели в виду свойство Id, нет необходимости объявлять вспомогательное поле, поскольку оно объявляется как автоматическое свойство, которое приведет к тому, что вспомогательное поле будет сгенерировано компилятором.

Существует также одноДругая проблема с вашим кодом.Ваш конструктор Person s устанавливает для параметра ID значение свойства Id, которое равно нулю и, вероятно, не то, что вам нужно.

Так что для очистки вашего кода вы можете захотеть использовать что-товот так.

class Person 
{
    public Person (){}
    public Person (int id)
    {
        Id = id
    }

    public int Id {get;set} 
}

class Employee : Person
{
    private int empId;
    public Employee(): base(){}
    public Employee(int emp) : base(emp)
    {
        empId = Id;
    }
}

Кстати, вам не нужно хранить empId в отдельном поле, если его значение будет таким же, как Id.Поскольку Employee наследуется от Person, оно также будет иметь это свойство.

0 голосов
/ 23 сентября 2018

Я думаю, что id из класса Person и empId из класса Employee должны быть одним и тем же.Если это так, то нет необходимости иметь что-либо в классе Employee, поскольку класс Person уже предоставляет идентификатор через свойство Id.

Также вам не нужны такие конструкторы, как Person (int ID), если у вас есть конструкторPerson (), потому что вы можете использовать инициализацию для назначения идентификатора через свойство Id.А в личном классе я думаю, что вам на самом деле не нужны ни id, ни id, поскольку они ссылаются на два разных значения.Я думаю, вы имеете в виду, чтобы это было то же самое?Если это так, вот код, который будет делать то, что вам нужно.

class Person
{
    public int Id { get; set; }
}

class Employee : Person
{
}

// code somewhere else

Employee employee = new Employee { Id = 10 };
0 голосов
/ 23 сентября 2018

У вас есть несколько проблем, из-за которых код не компилируется, потому что ваши пропущенные точки с запятой и свойства неверны, однако, как только это будет сделано, ваш конструктор Person будет неправильным, поскольку у вас неправильное назначение.Наконец, свойство getID не инициализируется, поэтому оно всегда будет равно 0.

Наконец, свойство getId является избыточным, поскольку вы наследуете от Person свойство Id, поэтому оно даже не требуется.Если вы хотите получить идентификатор сотрудника, вы называете свойство Id.

Вот как это должно выглядеть.

class Person 
{
    public Person (){}
    public Person (int ID)
    {
        Id = ID;
    }
    public int Id {get; set;} 
}

class Employee: Person
   {
        public Employee():base(){}
        public Employee(int emp):base(emp){}
    }

Редактировать: OP обновил этот вопрос.

Во-первых, я настоятельно рекомендую вам вернуться к основам и перечитать, как работают конструкторы.В вашем классе сохраняемой учетной записи в обоих конструкторах вы передаете переменную, но, казалось бы, перезаписываете ее без причины.Я думаю, вы неправильно понимаете, как работает оператор присваивания.Если вы просто передадите аргумент в дочерний класс, он назначит его правильно, потому что вы вызываете конструктор base ().

Например, приведенный ниже конструктор действителен и назначит правильный баланс экземпляру SavingsAccount

public SavingsAccount ( decimal initialBalance ) : base ( initialBalance ){}

Кроме того, приведенный ниже конструктор не имеет никакого смысла, вы передаете сумму процентов, а затем перезаписываете, поэтому она всегда будет равна 0.

public SavingsAccount ( double interests )
{
    interests = Interest;
}

Вместо этого поменяйте местами присвоение, чтобы свойство обновлялось с правильным значениемвы прошли, например, Interest = interests;

Если вы хотите расширить этот конструктор, вы также можете смешать их оба, чтобы получить сберегательный счет с интересом и балансом, не используя такие свойства, как:

public SavingsAccount ( decimal initialBalance, double interest ) : base ( initialBalance )
{
    Interest = interest;
}

Во-вторых, вы неправильно понимаете, как работает наследование, вам не нужен экземпляр дочерних и родительских классов.Если вы создадите экземпляр дочернего класса, он унаследует поля и методы-члены.Если вам не нужен экземпляр класса Account по другим причинам, вам не нужно его создавать.Достаточно просто создать экземпляр Saving, это позволит вам получить доступ к методам / полям класса Account.Например, приведенного ниже кода достаточно

SavingsAccount savings = new SavingsAccount (); //Creates SavingAccount instance
Console.Write ( "Enter account balance: " );
savings.AccountBalance = Convert.ToDecimal ( Console.ReadLine () ); //Assigns an account balance to SavingAccount instance you have created
Console.WriteLine ( "Enter Interest rate in percentage: " );
savings.Interest = Convert.ToInt32 ( Console.ReadLine () ); //Assigns an interst to SavingAccount instance you have created
Console.WriteLine ( savings.AccountBalance );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...