1.如果我们把一个基类的函数声明为virtual,该函数可以在任何派生类中重写(override),这里成员字段和静态函数不能声明为virtual,如:
class MyBaseClass
{
public virtual string MyVirtualMethod()
{}
}
class MyClass2:MyBaseClass
{
public override string MyVirtualMethod()
{}
}
这表示可以在派生与MyBaseClass的类MyClass2中创建MyVirtualMehtod()的另一种执行方式,需要使用相同的方法签名。
MyClass2 b = new MyClass2();
string s = b.MyVirtualMethod(); //在这里调用的是MyClass2中重写以后的方法,不是基类MyBaseClass中的方法
如果我们期望派生类中隐藏和基类中相同签名的方法,但不使用virtual,可在派生类中如此声明:public new string MyVirtualMentod(){}
2.抽象类和抽象函数
我们把类和函数声明为abstract时,抽象类不能实例化.密封,而且抽象函数也没有执行代码,必须在非抽象的派生类中重写,包含抽象函数的类,也必须声明为抽象类
abstract class MyAbstractClass
{
public abstract string Method();
}
class MyClass2: MyAbstractClass
{
public override string Method()
{}
}
3.接口
接口声明时使用interface关键字,声明时在语法上与声明抽象类相同,但不允许提供接口中任何成员的执行方式,接口中可包含方法.属性.索引器和事假的声明。接口不能实例化,接口成员总是公共的,不能声明为虚拟和静态。
public interface MyInterface
{
void Method();
}
Class A:MyInterface
{
public void Method()
{//具体实现};
}
一个类可以继承多个接口,接口之间也可以相互继承,继承子接口的类,必须执行父级接口中所有的方法,以及子接口中的方法。
class MyBaseClass
{
public virtual string MyVirtualMethod()
{}
}
class MyClass2:MyBaseClass
{
public override string MyVirtualMethod()
{}
}
这表示可以在派生与MyBaseClass的类MyClass2中创建MyVirtualMehtod()的另一种执行方式,需要使用相同的方法签名。
MyClass2 b = new MyClass2();
string s = b.MyVirtualMethod(); //在这里调用的是MyClass2中重写以后的方法,不是基类MyBaseClass中的方法
如果我们期望派生类中隐藏和基类中相同签名的方法,但不使用virtual,可在派生类中如此声明:public new string MyVirtualMentod(){}
2.抽象类和抽象函数
我们把类和函数声明为abstract时,抽象类不能实例化.密封,而且抽象函数也没有执行代码,必须在非抽象的派生类中重写,包含抽象函数的类,也必须声明为抽象类
abstract class MyAbstractClass
{
public abstract string Method();
}
class MyClass2: MyAbstractClass
{
public override string Method()
{}
}
3.接口
接口声明时使用interface关键字,声明时在语法上与声明抽象类相同,但不允许提供接口中任何成员的执行方式,接口中可包含方法.属性.索引器和事假的声明。接口不能实例化,接口成员总是公共的,不能声明为虚拟和静态。
public interface MyInterface
{
void Method();
}
Class A:MyInterface
{
public void Method()
{//具体实现};
}
一个类可以继承多个接口,接口之间也可以相互继承,继承子接口的类,必须执行父级接口中所有的方法,以及子接口中的方法。