首页 > 解决方案 > c#关于多态性的错误。在程序结束时使用Get String()方法它说没有像obj.earnings()这样的方法

问题描述

namespace OOPHomework
{
    public partial class EmployeeTestForm : Form
    {
        public EmployeeTestForm()
        {
            InitializeComponent();

            //Construct objects of different types
            Boss boss = new Boss("John", "Smith", 800);

            CommissionWorker commissionWorker =
               new CommissionWorker("Sue", "Jones", 400, 3, 150);

            PieceWorker pieceWorker = new PieceWorker("Bob", "Lewis",
               Convert.ToDecimal(2.5), 200);

            HourlyWorker hourlyWorker = new HourlyWorker("Karen",
               "Price", Convert.ToDecimal(13.75), 50);


            //Declare a reference and use it to process boss object
            Employee employee = boss;
            string output = GetString(employee) + boss + " earned " +
                  boss.Earnings().ToString("C") + "\n\n";

            //Use reference  to process commission Worker object
            employee = commissionWorker;
            output += GetString(employee) + commissionWorker +
               " earned " +
               commissionWorker.Earnings().ToString("C") + "\n\n";

            //Use reference  to process pieceWorker object
            employee = pieceWorker;
            output += GetString(employee) + pieceWorker +
               " earned " + pieceWorker.Earnings().ToString("C") +
               "\n\n";

            //Use reference  to process hourlyWorker object
            employee = hourlyWorker;
            output += GetString(employee) + hourlyWorker +
               " earned " + hourlyWorker.Earnings().ToString("C") +
               "\n\n";

            displayLabel.Text = output;
        }

        // return string that contains Employee information
        public static string GetString(object emp)
        {
            return emp.ToString() + " earned " + ***emp.Earnings()***.ToString("C")   + "\n";
        }
    }
}`

这里它说没有像emp.Earnings(). 但是,在我的代码中,每个班级都有一个单独的收入函数。

标签: c#polymorphism

解决方案


这里它说没有像 emp.Earnings() 这样的方法。但是在我的代码中,每个类都有一个单独的收益函数。

public static string GetString(object emp)

作为传递的对象object emp实际上有一个emp.Earnings() 作为 Employee的方法, 而不是作为一个对象。您的对象所具有的方法、属性等取决于您如何对待该对象。在这种情况下,您希望将您object emp 视为 Employee,为此您需要使用强制转换表达式

// return string that contains Employee information
public static string GetString(object obj)
{
    Employee emp = obj as Employee;
    if (emp != null) 
        return emp.ToString() + " earned " + emp.Earnings().ToString() + "\n";
    else return "Object is not an employee!";
}

推荐阅读