Tez*_*eld 1 c# polymorphism class
在我更多地了解多态性的过程中,我构建了一个小测试并且它返回了意想不到的结果.
所以我的想法是用虚拟/覆盖关键字覆盖基类方法,但似乎我不需要那些?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码我期待结果如下:
但相反,下面写入控制台:
我假设后者不起作用,因为它需要ovrride关键字.
所以问题是为什么我没有适当的关键词看到后面的名字?
我希望这很清楚,可以阅读.
问候,
您显示的代码中没有多态性.
将其更改为:
Employee employee = new Employee();
Employee partTimeEmployee = new PartTimeEmployee();
Employee fullTimeEmployee = new FullTimeEmployee();
Run Code Online (Sandbox Code Playgroud)
你会得到你期望的结果.
更新:
OOP中"多态"(多种形式)的概念意味着代码处理某些类型(基类或接口)的引用,而这些引用后面可能存在不同类型(后代,实现)的实例.对于"踢入"的多态,必须有继承和虚方法(在接口实现的情况下使用不同的术语,但让我们使用与您的代码示例相关的术语).您有继承,但没有虚拟方法.对于常规(非虚拟)方法,方法调用在编译时根据调用其方法的对象类型进行解析.
代码:
PartTimeEmployee partTimeEmployee = ...;
partTimeEmployee.writeName();
Run Code Online (Sandbox Code Playgroud)
编译器清楚地知道writeName要调用什么方法,它是PartTimeEmployee.writeName.同样,对于代码:
Employee partTimeEmployee = ...;
partTimeEmployee.writeName();
Run Code Online (Sandbox Code Playgroud)
要调用的方法是Employee.writeName.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |