2010-01-09 2 views
0

У меня есть 3 класса: класс PassengerDetails, который наследуется классом FlightDetails, который, в свою очередь, наследуется классом Details. У обоих, PassengerDetails и FlightDetails есть метод Accept, который принимает некоторые параметры и назначает его локальным переменным (объявленным как защищенным) этого класса. Что мне нужно сделать, это использовать метод Show in Details. Я хочу напечатать значения этих локальных переменных класса PassengerDetails и FlightDetails. вот несколько частей всего моего кода:Как получить доступ к значению переменных-членов базового класса из производного класса

class PassengerDetails 
    { 
     protected string strFirstName; 
     protected int iAge; 

     public void Accept(string FirstName, int Age) 
     { 
      strFirstName = FirstName; 
      iAge = Age; 
     } 
    } 
    class FlightDetails:PassengerDetails 
    { 
     protected DateTime dt; 
     protected int iNumPass; 

     public void Accept_1(DateTime date,int NumPass) 
     { 
      dt = date; 
      iNumPass = NumPass; 
     } 
    } 
    class Details : FlightDetails 
    { 
     public void Show(Label lbl) 
     { 

     lbl.Text= "" + strFirstName +"\n"+ iAge +"\n"+ dt.ToString() + "\n"+ iNumPass; 
     } 

    private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     PassengerDetails pass = new PassengerDetails(); 
     pass.Accept(txtFName.Text,Convert.ToInt32(txtAge.Text)); 
    } 
    private void btn2Submit_Click(object sender, EventArgs e) 
    { 
     FlightDetails fgt = new FlightDetails(); 
     fgt.Accept_1(Convert.ToDateTime(dtDep.Text),Convert.ToInt32(txtNPass.Text)); 

     Details det = new Details(); 
     det.Show(lblShow); 

, когда я это сделать, все это я получаю значение этих локальных переменных по умолчанию. может кто-нибудь помочь?

+3

Эта иерархия наследования * причудливая *. Как детали детали своего полета? Как данные о рейсе являются своего рода пассажирскими деталями? Разве не имело бы смысла иметь Детали как базовый класс FlightDetails и PassengerDetails, а FlightDetails содержит коллекцию PassengerDetails? Таким образом, вы будете представлять отношения «детали полета - это детализация деталей, детали пассажиров - это детали, детали рейса включают детали всех пассажиров». –

ответ

2

Вы вызываете методы Accept и Accept_1 в отдельных экземплярах рассматриваемых классов. Ваш Details класс предоставляет их непосредственно по наследству, так что вы должны заменить это:

PassengerDetails pass = new PassengerDetails(); 
pass.Accept(txtFName.Text,Convert.ToInt32(txtAge.Text)); 

с этим:

this.Accept(txtFName.Text,Convert.ToInt32(txtAge.Text)); 

или, более просто (возможно):

Accept(txtFName.Text,Convert.ToInt32(txtAge.Text)); 

Дело в том, , ваш экземпляр Details уже является экземпляром FlightDetails и PassengerDetails, поэтому вам не нужно создавать отдельные. Однако, глядя на имена классов, я сильно подозреваю, что вы можете злоупотреблять наследованием и что подход к композиции может быть более уместным: Details, отображающий свойства типов FlightDetails и PassengerDetails.

+0

Дело в том, что все вышеперечисленные 3 класса находятся в основной форме и, следовательно, с использованием этого ключевого слова дает ошибку \t «WindowsApplication1.frmMain» не содержит определения для «Accept_1» –

+0

В этом коде показаны эти методы, определенные в 'Details' класс - я подозреваю, что вы где-то потеряли скобки. В этом случае вам нужно создать только один экземпляр «Details» и вызвать два метода Accept в этом экземпляре, а не создавать экземпляры каждого родительского класса. Но я все еще думаю, что вы должны смотреть на композицию, а не наследование. –

+0

thx много, получил то, что я хотел, создав единый экземпляр Details в классе основной формы, а затем вызвав два метода accept & accept_1 в обработчиках событий btnSubmit_Click и btn2Submit_Click, используя этот экземпляр. –

1

Вы можете получить доступ к значениям FlightDetails по

base.fieldname 

и для доступа к значениям PassengerDetails, добавить свойство FlightDetails:

public type property 
{ 
    get {return base.fieldname;} 
} 

и детали использовать свойство.

Смежные вопросы