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

C# C中父类方法中如何调用子类字段#,c#,inheritance,C#,Inheritance,我想在继承的Detail()方法中打印被调用(其中任何一个)子类的工资。在这种情况下不能这样做。我如何获得工资以及员工的所有其他详细信息 这是密码 using System; class Employee { public int ID; public string Name; public string Gender; public string City; public void Detail() { Console.Wri

我想在继承的
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 


    }

}

你不能也不应该——不能保证
员工会有薪水

相反,任何具有salary的类都可以覆盖
ToString
,以包含它想要包含的所有属性。顺便说一下,我建议重写
ToString
,而不是使用只打印信息的
Detail
方法


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

您应该覆盖PermanatEmp和TempEmp中的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);
     } 
}

在你的情况下,你可以有一份基本工资

public float Salary { get {return GetSalary();}}
其中GetSalary是根对象的抽象方法


然后,也可以使用
virtual/override
方法修饰符在每个子类中重写受保护的float GetSalary()
方法,但不复制子类中的代码。根据您的需要进行调整:

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()
方法,您的设计将更干净、更灵活。但基本思想是相似的。

Thankx。。。我是C#的初学者,你能告诉我在这种情况下如何覆盖这里吗?因为这个员工有工资,我也想显示他的工资。@QadeerMangrio:你做过什么调查吗?有很多教程和书籍解释如何重写方法。我对我的答案做了一些修改-我没有发现您现有的方法实际上只是转储到控制台。。。最好在Employee中重写ToString,然后在每个子类中进一步重写它。谢谢这对我帮助很大。根据jon skeet的合理建议进行了更新。不要使用发布字段和覆盖ToString@sstn就这样。ThanksyYou应该重写子类中的父类方法。并根据您的需求编写子实现。