繁体   English   中英

C#如何在父类的方法中调用子类的字段

[英]How to call a field of child class in the method of parent class in C#

我想在Detail()的继承方法中打印被调用(其中任何一个)子类的工资。 在这种情况下无法做到这一点。 我如何获得员工的所有其他详细信息的薪水。

这是代码

using System;

class Employee
{
    public int ID;
    public string Name;
    public string Gender;
    public string City;

    public void Detail()
    {
        Console.WriteLine("Name: {0} \nGender: {1} \nCity: {2} \nID: {3}", Name, Gender, City, ID); //I want to get Yearly or Hourly Salary with these all
    }
}

class PermanatEmp : Employee
{
    public float YearlySalary;

}

class TempEmp : Employee
{
    public float HourlySalary;
}



class Class4
{
    static void Main()
    {
        PermanatEmp pe = new PermanatEmp();
        pe.ID = 101;
        pe.Name = "XYZ";
        pe.Gender = "Male";
        pe.City = "London";
        pe.YearlySalary = 20000;
        pe.Detail(); // how to get Salary with these all 


    }

}

你不能也不应该 - 不能保证Employee会有薪水。

取而代之的是,它确实有一个薪水任何类可以重写ToString包括所有它想要的属性。 顺便说一下,我建议覆盖ToString而不是有一个只打印信息的Detail方法。

(作为旁注,我强烈建议您不要使用公共可写字段。 改用属性。)

using System;

class Employee
{
   public int ID {get; set;}
   public string Name {get; set;}
   public string Gender {get; set;}
   public string City {get; set;}

   public override string ToString() 
   {
    return string.Format("Name: {0} \nGender: {1} \nCity: {2} \nID: {3}", Name, Gender, City, ID);
   }   
}

class PermanatEmp : Employee
{
    public float YearlySalary {get; set;}

        public override string ToString() 
        {
            return base.ToString()+string.Format("\nYearly Salary: {0}"), YearlySalary);
        } 
    }   
}

class TempEmp : Employee
{
     public float HourlySalary {get; set;}
     public override string ToString()  
     {
        return base.ToString()+string.Format("\nHourly Sal:{0}", HourlySalary);
     } 
}

首先介绍虚拟和抽象方法会很好:https ://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx

https://msdn.microsoft.com/en-us/library/aa664435(v=vs.71).aspx

在您的情况下,您可以在基类中获得 Salary get 属性

public float Salary { get {return GetSalary();}}

其中 GetSalary 是根对象的抽象方法

比您可以覆盖每个孩子中的protected float GetSalary()方法

您应该覆盖 PermanatEmp 和 TempEmp 中的 Detail 方法,以便它们都有自己的实现。

还使用virtual/override方法修饰符,但不复制子类中的代码。 根据您的需求进行调整:

class Employee
{
    public int ID;
    public string Name;
    public string Gender;
    public string City;

    public virtual void Detail() // add virtual keyword here to allow overrides.
    {
        Console.WriteLine("Name: {0} \nGender: {1} \nCity: {2} \nID: {3}", Name, Gender, City, ID); //I want to get Yearly or Hourly Salary with these all
    }
}

class PermanatEmp : Employee
{
    public float YearlySalary;

    public override void Detail()
    {
        base.Detail(); // prints base class fields.
        Console.WriteLine("Yearly Salary: {0}", YearlySalary);
    }
}

class TempEmp : Employee
{
    public float HourlySalary;

    public override void Detail()
    {
        base.Detail(); // prints base class fields.
        Console.WriteLine("Hourly Salary: {0}", HourlySalary);
    }
}

注意:我同意 Jon Skeet 的观点,如果您改写ToString()方法,您将拥有更简洁、更灵活的设计。 但无论哪种方式,基本思想都是相似的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM