簡體   English   中英

如何使用繼承在c#中創建一個簡單的atm程序

[英]How to Create a simple atm program in c# using inheritance

我正在嘗試使用 C# 使用繼承創建一個電子 ATM 控制台應用程序,但每次調試時我都會看到派生類值為null ,而基類字段或屬性填充了值。 為什么派生類即使在繼承自基類之后也不顯示包含其數據的列表?

class CreateAccount
{
    string firstName, lastName, dateOfBirth, phoneNO, fathersName, mothersName;
    double initialBalance; int pinNo = 100, accountNo = 1234, age; DateTime yearOfBirth;

    protected static List<CreateAccount> data = new List<CreateAccount>();

    protected string FirstName
    {
        get { return this.firstName; }
        set
        {
            if (string.IsNullOrEmpty(value)) throw new Exception();
            else firstName = value;
        }
    }
    protected string LastName
    {
        get { return this.lastName; }
        set
        {
            if (string.IsNullOrEmpty(value)) throw new Exception();
            else lastName = value;
        }
    }
    protected string DateOfBirth
    {
        get { return this.dateOfBirth; }
        set
        {
            if (string.IsNullOrEmpty(value)) throw new Exception();
            else dateOfBirth = value;
        }
    }
    protected string PhoneNo
    {
        get { return this.phoneNO; }
        set
        {
            if ((string.IsNullOrEmpty(value)) || value.Length != 10)
                throw new Exception();
            else
                phoneNO = value;
        }
    }
    protected string FathersName
    {
        get { return this.fathersName; }
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new Exception();
            else
                fathersName = value;
        }
    }
    protected string MothersName
    {
        get { return this.mothersName; }
        set
        {
            if (string.IsNullOrEmpty(value))
                throw new Exception();
            else
                mothersName = value;
        }
    }
    protected double InititailBalance
    {
        get { return this.initialBalance; }
        set
        {
            if (double.IsNaN(value))
                throw new Exception();

            else
                initialBalance = value;
        }
    }
    protected int PinNo
    {
        get { return this.pinNo; }
    }
    protected int AccountNo
    {
        get { return this.accountNo; }
    }
    public void GenerateAccount()
    { 
         // code for asking user for their details.
        data.Add(this);
    }
}


class ATM :CreateAccount
{
    public void Deposit()
    {
        Console.WriteLine("Enter your account number");
        int accountNo = int.Parse(Console.ReadLine());

        if (accountNo == AccountNo)
        {
            Console.WriteLine("Enter your amount you wish to deposit");
            int amount = int.Parse(Console.ReadLine());
            InititailBalance+= amount;
        }
    }
}   


class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("Menu");
            Console.WriteLine("1.Create Account");
            Console.WriteLine("2.ATM");
            Console.Write("Please enter your selections: ");
            int select = int.Parse(Console.ReadLine());

            switch (select)
            {
                case 1:
                    CreateAccount account = new CreateAccount();
                    account.GenerateAccount();
                    break;

                case 2:
                    ATM atm = new ATM();
                    atm.Deposit();
                    break;

            }
        }
    }
}

您正在創建兩個不同的對象:“CreateAccount”對象和“ATM”對象。 ATM 對象不會自動繼承先前創建的 CreateAccount 對象的值,它們是兩個完全不同的、不相關的實體。

因此,為了使您的 ATM 對象具有與 CreateAccount 對象相同的值,您必須將 CreateAccount 對象復制到您的 ATM 對象。

CreateAccount account = new CreateAccount();
//set account variables here
ATM atm = (ATM)account;

這是如何正確使用繼承來完成的,這在這種情況下實際上是無用的。 在這種情況下, Dictionary是合適的數據結構,因為您可以避免使用它重復。 同樣從此代碼中,您可能希望從Account類中刪除accountNo以避免保留重復的數字並在調用GenerateAccount()方法之前詢問它。 所以這是完整的控制台應用程序:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ATM
{
    class Account
    {
        string firstName, lastName, dateOfBirth, phoneNO, fathersName, mothersName;
        double initialBalance; 
        int pinNo, accountNo, age; 
        DateTime yearOfBirth;

        public Account() 
        {
            pinNo = 100;
            accountNo = 1234;
        }

        public string FirstName
        {
            get { return this.firstName; }
            set
            {
                if (string.IsNullOrEmpty(value)) throw new Exception();
                else firstName = value;
            }
        }
        public string LastName
        {
            get { return this.lastName; }
            set
            {
                if (string.IsNullOrEmpty(value)) throw new Exception();
                else lastName = value;
            }
        }
        public string DateOfBirth
        {
            get { return this.dateOfBirth; }
            set
            {
                if (string.IsNullOrEmpty(value)) throw new Exception();
                else dateOfBirth = value;
            }
        }
        public string PhoneNo
        {
            get { return this.phoneNO; }
            set
            {
                if ((string.IsNullOrEmpty(value)) || value.Length != 10)
                    throw new Exception();
                else
                    phoneNO = value;
            }
        }
        public string FathersName
        {
            get { return this.fathersName; }
            set
            {
                if (string.IsNullOrEmpty(value))
                    throw new Exception();
                else
                    fathersName = value;
            }
        }
        public string MothersName
        {
            get { return this.mothersName; }
            set
            {
                if (string.IsNullOrEmpty(value))
                    throw new Exception();
                else
                    mothersName = value;
            }
        }
        public double InititailBalance
        {
            get { return this.initialBalance; }
            set
            {
                if (double.IsNaN(value))
                    throw new Exception();

                else
                    initialBalance = value;
            }
        }
        public int PinNo
        {
            get { return this.pinNo; }
        }
        public int AccountNo
        {
            get { return this.accountNo; }
        }
        public void GenerateAccount()
        {
            // code for asking user for their details.
        }
    }


    class ATM
    {
        public static Dictionary<int, Account> AccountsList;

        static ATM() 
        {
            AccountsList = new Dictionary<int, Account>();
        }

        public void CreateAccount()
        {
            Account acc = new Account();
            acc.GenerateAccount();
            AccountsList.Add(acc.AccountNo, acc);
        }

        public void Deposit()
        {
            Console.WriteLine("Enter your account number");
            int accountNo = int.Parse(Console.ReadLine());

            if (AccountsList.ContainsKey(accountNo))
            {
                Console.WriteLine("Enter your amount you wish to deposit");
                int amount = int.Parse(Console.ReadLine());
                AccountsList[accountNo].InititailBalance += amount;
            }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            ATM atm = new ATM();
            while (true)
            {
                Console.WriteLine("Menu");
                Console.WriteLine("1.Create Account");
                Console.WriteLine("2.ATM");
                Console.Write("Please enter your selections: ");
                int select = int.Parse(Console.ReadLine());

                switch (select)
                {
                    case 1:
                        atm.CreateAccount();
                        break;

                    case 2:
                        atm.Deposit();
                        break;
                    default:
                        Console.WriteLine("Invalid selection!");
                        break;
                }
            }
        }
    }
}

CreateAccountAtm的操作,這就是為什么我認為您不應該使用繼承。 我提出這個解決方案:

班級帳號:

class Account
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string PhoneNumber { get; set; }
    public double Balance { get; set; }

    // More properties here
    ...
}

班級ATM:

class Atm
{
    public List<Account> Accounts { get; set; }

    public Atm()
    {
        Accounts = new List<Account>();
    }

    public void CreateAccount()
    {
        var account = new Account();

        // Get details from user here:
        ...

        account.Balance = 0.0;
        account.Id = Accounts.Count + 1;

        Accounts.Add(account);
    }

    public void Deposit()
    {
        int accountId;

        // Get input from the user here:
        // --------------------------------
        // 1. Check that the account exists
        // 2. Deposit into the account.
        ...
    }

完整示例:

class Program
{
    static void Main()
    {
        var atm = new Atm();
        while (true)
        {
            int option;

            Console.WriteLine();
            Console.WriteLine("Menu:");
            Console.WriteLine("1. Create Account");
            Console.WriteLine("2. Deposit");
            Console.WriteLine();
            Console.Write("Please make a selection: ");

            var input = int.TryParse(Console.ReadLine(), out option);

            Console.WriteLine("-----------------");

            switch (option)
            {
                case 1:
                    atm.CreateAccount();
                    break;
                case 2:
                    atm.Deposit();
                    break;
            }
        }
    }
}

class Account
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string PhoneNumber { get; set; }
    public double Balance { get; set; }
}

class Atm
{
    public List<Account> Accounts { get; set; }

    public Atm()
    {
        Accounts = new List<Account>();
    }

    public void CreateAccount()
    {
        var account = new Account();

        Console.WriteLine("Create a new account!");
        Console.WriteLine();
        Console.Write("Enter first name: ");
        account.FirstName = Console.ReadLine();
        Console.Write("Enter last name: ");
        account.LastName = Console.ReadLine();
        Console.Write("Enter date of birth: ");
        account.DateOfBirth = DateTime.Parse(Console.ReadLine());
        Console.Write("Enter phone number: ");
        account.PhoneNumber = Console.ReadLine();

        account.Balance = 0.0;
        account.Id = Accounts.Count + 1;

        Accounts.Add(account);
    }

    public void Deposit()
    {
        int accountId;

        Console.Write("Enter your account number: ");
        int.TryParse(Console.ReadLine(), out accountId);

        var account = Accounts.FirstOrDefault(a => a.Id == accountId);
        if (account != null)
        {
            double amount;
            Console.Write("Enter amount to deposit: ");
            double.TryParse(Console.ReadLine(), out amount);
            account.Balance += amount;
            Console.Write("Your new balance is {0}", account.Balance);
        }
        else
        {
            Console.WriteLine("That account does not exist!");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM