Как присвоить значение полю в другом классе? - PullRequest
0 голосов
/ 19 октября 2018

В этой программе у меня 2 класса Application и Customer.Я хочу инициализировать Стандартную Тариф с некоторым значением, которое должно быть введено пользователем.Стандартное поле тарифа относится к классу клиентов.Я сделал это, но это не показывает желаемый результат.При вызове функции Calculate стоимость стандартного тарифа становится равной нулю.

Когда я инициализирую значение STANDARD_FARE в самом классе Customer, тогда программа работает так, как нужно.Как я могу ввести значение, данное пользователем в STANDARD_FARE?

Также методы, такие как GetAge (), GetPassNo () в классе Application, не возвращают значение того же самого.

 class Application
  {
    private static int Nop ;
    private static double TotalFare=0;
    Customer cust= new Customer(); 

    static void Main(string[] args)
      {
        Application obj = new Application();                      
        Console.Write("Enter the STANDARD RATE of the tour ");
        obj.cust.StandardFare = int.Parse(Console.ReadLine());

        a:
        Console.Clear();                                             
        Console.WriteLine("Enter the number of passengers");
        Nop = int.Parse(Console.ReadLine());                       

        Application[] app = new Application[Nop];                 

        if (Nop <= 0)                                               
        {
            Console.WriteLine("Please enter a valid number of passengers");
            Console.ReadKey();                                     
            goto a;
        }

        for (int i = 0; i < Nop; i++)
        {
            app[i] = new Application();                           
            app[i].GetInformationFromCust();         
        }

        for (int j = 0; j < Nop; j++)
        {

           app[j].cust.Display();                                  

       }                                             
     }

    public int GetInformationFromCust()
    {      
         b:
        Console.Clear();                                     
        int slen = 0;                                   

        Console.WriteLine("Enter the title of the passenger");
        cust.Customer_Title = Console.ReadLine();
        Console.WriteLine("\r\nEnter passenger's First name :");
        cust.Customer_FName = Console.ReadLine();
        Console.WriteLine("\r\nEnter passenger's Last name :");
        cust.Customer_LName = Console.ReadLine();
        slen = cust.Customer_FName.Length + cust.Customer_LName.Length;    
         if (slen < 5 || slen > 15)                                       
          {
            Console.WriteLine("\r\nName should be between 5 to 15 characters, Please try again ");
            Console.ReadLine();
            goto b;
          }

        c:
        long x = 0, len = 0;
        Console.WriteLine("\r\nEnter the passport number of the passenger ");
        cust.CustomerPassNo = int.Parse(Console.ReadLine());
        x = cust.CustomerPassNo;               

         while (x > 0)
          {
            x = x / 10;                    
            ++len;
          }
        if (len != 8)                    
          {
            Console.WriteLine("\r\nInvalid passport number, passport should be of 8 digits ");
            goto c;
          }

        d:
        Console.WriteLine("\r\nEnter the age of the passenger :");
        cust.Customer_Age = int.Parse(Console.ReadLine());
          if (cust.Customer_Age < 0)                                         
          {
             Console.WriteLine("\r\nInvalid age, please enter a valid age ");
             goto d;
          } 
        cust.CalculatePrice();                                          
        return 0;
    }

    public int GetAge()
    {
        return cust.Customer_Age;
    }

    public double GetAirFare()
    {
        return cust.CustomerTicket ;
    }

    public long GetPassportNo()
    {
        return cust.CustomerPassNo;
    }

    public string GetTitle()
    {
        return cust.Customer_Title;
    }
 }
class Customer 
  {
    const double K_DISCOUNT = 0.10;                            
    const double S_DISCOUNT = 0.20;

    private double STANDARD_FARE;
    private string CustomerName { get; set; }
    private int CustomerAge;
    private string CustomerFName;
    private string CustomerLName;
    private long CustomerPassport;
    private double CustomerPrice; 
    private string CustomerTitle;
    private double KidDiscount;
    private double SeniorDiscount;

    public Customer()                                         
    {
        this.KidDiscount = K_DISCOUNT;
        this.SeniorDiscount = S_DISCOUNT;
    }

    public double StandardFare
    {
        get { return STANDARD_FARE; }
        set { STANDARD_FARE = value; }
    }

    public int Customer_Age
    {
        get { return CustomerAge; }
        set { CustomerAge = value; }
    }

    public string Customer_Title
    {
        get { return CustomerTitle; }
        set { CustomerTitle = value; }
    }

    public string Customer_FName
    {
        get { return CustomerFName; }
        set { CustomerFName = value; }
    }

    public string Customer_LName
    {
        get { return CustomerLName; }
        set { CustomerLName = value; }
    }

    public long CustomerPassNo
    {
        get { return CustomerPassport; }
        set { CustomerPassport = value; }
    }

    public double CustomerTicket
    {
        get { return CustomerPrice; }
        set { CustomerPrice = value; }
    }


    public int CalculatePrice()
    {
        if (CustomerAge < 3)
        {
            CustomerPrice = 0;
        }
        else if (CustomerAge >= 3 && CustomerAge < 18)
        {
            CustomerPrice = STANDARD_FARE - (STANDARD_FARE * KidDiscount);
        }
        else if (CustomerAge > 65)
        {
            CustomerPrice = STANDARD_FARE - (STANDARD_FARE * SeniorDiscount);
        }
        else
        {
            CustomerPrice = STANDARD_FARE;
        }
        return 0;
    }

    public void Display()
    {
      //some code here
    }
}

OUtput

1 Ответ

0 голосов
/ 19 октября 2018

Вы заполняете свой массив app экземплярами Application, которые по-прежнему имеют значение STANDARD_FARE по умолчанию (равное 0,0), потому что вы никогда не устанавливали его для этих экземпляров .Вы только устанавливаете его на экземпляр obj.cust, , который вы никогда больше не используете .Поскольку STANDARD_FARE является переменной экземпляра, ее изменения не влияют на другие (или будущие) экземпляры.

У вас та же проблема, что и в случае со всеми Application.Get* функциями;они получают свойства объекта (obj.cust), для которого никогда не было установлено никаких свойств, кроме StandardFare / STANDARD_FARE.

Наиболее очевидное исправление - избавиться от obj и obj.cust полностью - они не имеют смысла, кроме как вводить в заблуждение - и делают STANDARD_FARE статической переменной (а ее установщик StandardFare статическим свойством).


Кстати, ваши соглашения об именах ужасны и непоследовательны;если бы я был вашим учеником, я бы выставил вам баллы за использование нечетких имен переменных (app, nop) и за использование ALL_CAPS для неконстантных (STANDARD_FARE).Я также возражал бы против использования частного свойства с автоматической поддержкой (CustomerName, которое также никогда не используется) вместо простой закрытой переменной, для не с использованием свойств с автоматической поддержкой в ​​других местах (StandardFare какявным образом закодированный публичный метод получения и установки для STANDARD_FARE и т. д.), а также для копирования постоянных значений в ненастраиваемые переменные экземпляра (от K_DISCOUNT до KidDiscount; просто используйте константу напрямую или, по крайней мере, сделайте KidDiscountстатический и добавить к нему не частный доступ).Как уже упоминали другие, вы, конечно, не должны использовать goto вместо циклов.Я также упомяну об подверженной ошибкам и неэффективной проверке длины номера паспорта путем повторного деления вместо простой проверки, является ли он меньше 99999999 (теоретически, номера паспорта могут начинаться с нуля, который будет выглядеть как менее 8 цифрпосле разбора, но вы также можете убедиться, что он больше 10000000, если хотите).

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