如标题,记录一下个人对这几个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