如何从派生类访问基类的成员变量的值

时间:2010-01-09 11:57:16

标签: c# inheritance

我有3个类:类PassengerDetails,它由类FlightDetails继承,而后者又由类Details继承。 PassengerDetails和FlightDetails都有一个方法Accept,它接受一些参数并将其分配给该类的局部变量(声明为protected)。我需要做的是通过使用方法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);

当我这样做时,我得到的只是那些局部变量的默认值。 有人能帮忙吗?

2 个答案:

答案 0 :(得分:2)

您在相关类的不同实例上调用AcceptAccept_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实例已经是FlightDetailsPassengerDetails的实例,因此您无需创建单独的实例。但是,查看类名,我强烈怀疑您可能滥用继承,并且组合方法可能更合适,Details公开类型FlightDetailsPassengerDetails的属性。

答案 1 :(得分:1)

您可以通过

访问FlightDetails的值
 base.fieldname

并且要访问PassengerDetails的值,请向FlightDetails添加属性:

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

并在详细信息中使用属性。