列表内容
实现继承和接口继承
● 实现继承:表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数;
● 接口继承;表示一个类型只继承了函数的签名,没有继承任何实现代码;
多重继承
● c#不支持多重实现继承,支持多重接口继承,即C#允许类型派生自多个接口。
结构和类
结构不支持实现继承,但支持接口继承。定义接口和类可以总结为:
● 结构总是派生自System.ValueType,他们还可以派生自任意多接口。
● 类总是派生自System.Object或用户选择的另一个类,他们还可以派生自任意多个接口。
虚方法
把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
public class MyVirtualClass
{
//虚方法 关键字virtual
public virtual void VirtualMethod()
{
Console.WriteLine("这是一个虚方法");
}
}
属性也可以声明为virtual
在派生类中重写另一个方法时应使用overrride关键字显式声明
public class MyVirtualClass
{
//虚方法 关键字virtual
public virtual void VirtualMethod()
{
Console.WriteLine("这是一个虚方法");
}
}
public class MyOverrideClass:MyVirtualClass
{
public override void VirtualMethod()
{
Console.WriteLine("这里重写了虚方法");
}
}
class Program
{
static void Main(string[] args)
{
MyVirtualClass a = new MyVirtualClass();
MyVirtualClass b = new MyOverrideClass();
MyOverrideClass c = new MyOverrideClass();
a.VirtualMethod(); //输出 "这是一个虚方法 "
b.VirtualMethod(); //输出 "这里重写了虚方法 "
c.VirtualMethod(); //输出 "这里重写了虚方法 "
Console.ReadKey();
}
}
成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。
隐藏方法
如果签名(ps:方法的签名包括方法的签名包括方法的名称,参数的数目,参数的数据类型和顺序,参数修饰符。常见错误:返回类型和形参的名称并不是签名的一部分)相同的方法在在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,派生类方法会自动隐藏基类方法。
但在编译代码时,程序在应该调用那个方法上会有潜在的冲突,编译时系统会发出警告。在C#中,要隐藏一个方法应使用new关键字声明。如下所示
public class HisBaseClass
{
public void MyGroovyMethod()
{
Console.WriteLine(0);
}
}
public class MyDerivedClass : HisBaseClass
{
public new void MyGroovyMethod()
{
Console.WriteLine(1);
}
}
class Program
{
static void Main(string[] args)
{
HisBaseClass a = new MyDerivedClass();
MyDerivedClass b = new MyDerivedClass();
a.MyGroovyMethod(); //输出 0
b.MyGroovyMethod(); //输出 1
Console.ReadKey();
}
}