如标题,记录一下个人对这几个c#关键字的简单理解。
abstract:修饰方法或类,分别叫做抽象方法或抽象类。抽象方法没有实现(函数体)。抽象类没有实例(对象)。
就是说,抽象方法只能留给子类实现,而且是必须实现。抽象类只能给别的类当父类(只能被继承)。
我们给某类定义一个抽象方法的时候,如果这个类没有abstract修饰,vs直接小红线提示。就是说,只要一个类有abstract的方法,它必须也要有abstract修饰。
virtual:修饰方法,叫做虚方法。虚方法有实现。
子类可以实现虚方法,也可以不实现。当子类实现虚方法之后,子类的对象调用的是自己的方法,而不是父类的虚方法。子类不实现,那就用父类的。
override:对于以上两种方法,子类重写的时候都要override关键字修饰。相对地,子类如果要重载父类的普通方法,用new关键字修饰。
另外,个人认为接口是一种特殊的抽象类。以及方法大概分三种:抽象方法、虚方法、普通方法。不知道这样理解对不对。
至于说,这几个东西为什么要有这样的区别,接口,抽象类,普通类,几种方法,等。主要是实际情况有对应的需求,现实世界本身就有很多抽象层次。
个人理解,接口是最高级的抽象约束,抽象类次之,再到普通的类,对应了抽象的级别。好像还有个泛型?或者其他抽象层次?这是一个思考方向,目前没有深入理解。
有个有点意思的代码:
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