c#:abstract和virtual,override。记录一下个人的简单理解

如标题,记录一下个人对这几个c#关键字的简单理解。

abstract:修饰方法或类,分别叫做抽象方法或抽象类。抽象方法没有实现(函数体)。抽象类没有实例(对象)。
就是说,抽象方法只能留给子类实现,而且是必须实现。抽象类只能给别的类当父类(只能被继承)。
我们给某类定义一个抽象方法的时候,如果这个类没有abstract修饰,vs直接小红线提示。就是说,只要一个类有abstract的方法,它必须也要有abstract修饰。

virtual:修饰方法,叫做虚方法。虚方法有实现。
子类可以实现虚方法,也可以不实现。当子类实现虚方法之后,子类的对象调用的是自己的方法,而不是父类的虚方法。子类不实现,那就用父类的。

override:对于以上两种方法,子类重写的时候都要override关键字修饰。相对地,子类如果要重载父类的普通方法,用new关键字修饰。

另外,个人认为接口是一种特殊的抽象类。以及方法大概分三种:抽象方法、虚方法、普通方法。不知道这样理解对不对。
至于说,这几个东西为什么要有这样的区别,接口,抽象类,普通类,几种方法,等。主要是实际情况有对应的需求,现实世界本身就有很多抽象层次。
个人理解,接口是最高级的抽象约束,抽象类次之,再到普通的类,对应了抽象的级别。好像还有个泛型?或者其他抽象层次?这是一个思考方向,目前没有深入理解。

有个有点意思的代码:

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
class Program
    {
        class A
        {
            public void f1(A a)
            {
                f2(1);
                a.f2(5);
            }

            public virtual void f2(int i)
            {
                Console.WriteLine(i);
            }
        }

        class B : A
        {
            public override void f2(int i)
            {
                Console.WriteLine(++i);
            }
        }

        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            a.f1(b);
            b.f1(a);
        }
    }

运行结果是:
1
6
2
5