接口、抽象类、虚方法、重写、重载的关系
1、重载
重载就是在同一个类中,方法名相同,参数列表不同。参数列表不同包括:参数的个数不同,参数类型不同等。返回的数据类型可以不相同。代码如下:
public class ClassA { public void Search() public string Search(int a) public int Search(string b) }
也就是说,他们虽然名字相同,但是方法都是独立的,毫无关系的。
2、重写就是子类重写父类的方法,父类声明一个虚方法,子类可以选择重写与否。如果重写,调用ClassB中的search方法就是调用子类重写过的方法,也就是ClassB的方法。如果不重写,调用ClassC中的search方法就是调用继承的父类中的方法,也就是ClassC中的方法。这种非抽象类的方法重写,可以被重写的方法必须在修饰符后面加上 virtual 关键字,重写的方法也需要在修饰符后面加上 override 关键字。代码如下:
public class ClassA { public virtual string Search() { return "A"; } } public class ClassB : ClassA { public override string Search() { return "B"; } } public class ClassC : ClassA { }
3、抽象也可以用来实现方法的重写。但是抽象方法必须放在抽象类中,继承抽象类的子类必须实现抽象类中的抽象方法,抽象类中的非抽象方法不用强制实现。抽象类中的抽象方法没有主体,且抽象类无法被实例化,只能通过子类继承调用。声明一个抽象类和抽象方法都需要在修饰符后加上 abstract 关键字,子类实现(重写)抽象方法,需要在修饰符后加上 override 关键字。代码如下:
public abstract class ClassA { public abstract string Search(); public void test() { } } public class ClassB : ClassA { public override string Search() { return "B"; } }
4、接口的实现和抽象类类似,继承接口的类也必须实现接口中的方法。不过不同的是,接口中的方法不需要修饰符,不能直接在接口中实现(方法不能有主体),不需要关键字。而且一个类只能继承一个类,却可以继承多个接口。代码如下:
public interface ITest { string Search(); } public class ClassB : ITest { public string Search() { return ""; } }