【发布时间】:2014-08-27 13:49:20
【问题描述】:
为了进一步了解多态性,我构建了一个小测试,它返回了意想不到的结果。
所以想法是用 virtual/override 关键字覆盖基类方法,但似乎我不需要这些?
public class Employee
{
public Employee()
{
this.firstName = "Terry";
this.lastName = "Wingfield";
}
public string firstName { get; set; }
public string lastName { get; set; }
public void writeName()
{
Console.WriteLine(this.firstName + " " + this.lastName);
Console.ReadLine();
}
}
public class PartTimeEmployee : Employee
{
public void writeName()
{
Console.WriteLine("John" + " " + "Doe");
Console.ReadLine();
}
}
public class FullTimeEmployee : Employee
{
public void writeName()
{
Console.WriteLine("Jane" + " " + "Doe");
Console.ReadLine();
}
}
static void Main(string[] args)
{
Employee employee = new Employee();
PartTimeEmployee partTimeEmployee = new PartTimeEmployee();
FullTimeEmployee fullTimeEmployee = new FullTimeEmployee();
employee.writeName();
partTimeEmployee.writeName();
fullTimeEmployee.writeName();
}
}
使用上面的代码,我期待这样的结果:
- 特里·维格菲尔德
- 特里·温菲尔德
- 特里·温菲尔德
但下面的内容被写入控制台:
- 特里·温菲尔德
- 约翰·多伊
- 简·多伊
我认为后者不起作用,因为它需要 ovrride 关键字。
所以问题是为什么我看到后面的名字没有适当的关键字?
我希望这足够清楚,可以阅读。
问候,
【问题讨论】:
-
这是因为子类中的
writeName()是隐藏基类中的版本(您应该已经看到了关于此的编译器警告)。如果你将这三个都转换为Employees,你应该会看到第一个结果。 -
@JLRishe 非常感谢。
标签: c# class polymorphism