C# 方法隐藏(new)和重写(override)方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;

namespace Test
{
class A
{
public virtual void Print()
{
Console.WriteLine("A");
}
}
class B : A
{
public new void Print()
{
Console.WriteLine("B");
}
}
class C : A
{
public override void Print()
{
Console.WriteLine("C");
}
}

class Program
{
static void Main(string[] args)
{
A a1 = new B();
a1.Print(); // 输出"A"
A a2 = new C();
a2.Print(); // 输出"C"
A a = new A();
a.Print(); //输出"A"
}
}
}

以下的理解主要是记录方便自己日后回忆,不太懂术语,可能会表达错误或者不严谨。

方法隐藏相当于在子类中定义新方法,而方法重写则是重新定义父类中方法的内容

没有去了解C#底层如何实现子类实例转换成父类实例,不过经过测试,子类实例转换成父类实例时,我的理解就是,把父类实例里的属性方法遍历一下,如果子类实例中也有对应的,以子类实例的为准,把子类实例的拿来”替换”掉,所以有重写的话,它们都是指向同一个方法,就会替换掉,而方法隐藏相当于在子类中定义新方法,因此不算,也就不会进行”替换”。而且强调实例是因为这个所谓的”替换”,并不会真正影响到父类,只在生成实例时影响,因为最后a.print(),依旧输出了”A“。

作者

DullSword

发布于

2020-01-03

更新于

2024-07-02

许可协议

评论