多态性出乎意料的结果

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)

使用上面的代码我期待结果如下:

  1. 特里威兹菲尔德
  2. 特里温菲尔德
  3. 特里温菲尔德

但相反,下面写入控制台:

  1. 特里温菲尔德
  2. 约翰·多伊
  3. 简·多伊

我假设后者不起作用,因为它需要ovrride关键字.

所以问题是为什么我没有适当的关键词看到后面的名字?

我希望这很清楚,可以阅读.

问候,

Igo*_*gor 5

您显示的代码中没有多态性.

将其更改为:

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.