实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。在给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承是非常有效的。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。
c#不支持多重继承,确切地说,c#中一个类除了Object类之外都有一个基类,还可以有任意多个基接口。
结构不支持实现继承,但支持接口继承。
注意:结构总是派生于System.ValueType,它们还可以派生于任意多个接口。
类总是派生于用户选择的另一个类,它们还可以派生于任意多个接口。
二、实现继承
语法:
class MyDerivedClass : MyBaseClass
{
//functions and data members here
}
注意:c#不支持私有继承。
如果同时继承接口,语法:
public class MyDerivedClass : MyBaseclass,IInterface1,IInterface2
{
//etc.
}
对于结构,语法如下:
public struct MyDerivedStruct : IInterface1,IInterface2
{
//etc.
}
1、虚方法。
把一个基类函数声明为virtual,该函数就可以在派生类中重写了:
class MyBaseClass
{
public virtual String VirtualMethod()
{
return "This method is virtual and defined in MyBaseClass";
}
}
也可以将属性写成虚属性或重写属性。
public virtual string ForeName
{
get {return foreName;}
set {foreName=value;}
}
private String foreName;
可以在派生类中重写虚函数,除非显式声明,否则函数就不是虚拟的,于c++不同的是,c#中重写函数要使用override关键字。如:
class MyDerivedClass : MyBaseClass
{
public override String VirtualMethod()
{
return "This method is an override defined in MyDerivedClass";
}
}
成员字段和静态函数都不能声明为virtual。
2、隐藏方法。
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,该派生类方法就会隐藏基类方法,但这不是一个好的方式,程序在调用哪个方法上会有潜在的冲突。
在c#中应当使用new关键字声明我们要隐藏的一个方法,如:
classMyDerivedClass : HisBaseClass
{
public new int MyGroovyMethod()
{
//some groovy implementation
return 0;
}
}
3、调用函数的基本版本。
base.
例如:假定派生类的一个方法返回基类的方法返回值的90%。
class CustomerAccount
{
public virtual decimal CalculatePrice()
{
//implementation
return 0.0M;
}
}
class GoldAccount : CustomerAccount
{
public override decimal CalculatePrice()
{
return base.CalculatePrice() * 0.9M
}
}
4、抽象类和抽象函数
抽象类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写,包含抽象函数的类就是抽象类。
abstract class Building
{
public abstract decimal CalculateHeationCost(); //abstract method
}
5、密封类和密封方法。
c#允许把类和方法声明为sealed,对于类来说,这表示不能继承该类:对于方法来说,这表示不能重写该方法。
sealed class FinalClass
{
//etc
}
class DerivedClass : FinalClass //wrong. Will give compilation error
{
//etc
}
6、派生类的构造函数。
构造函数的调用顺序总是先调用System.Object,再按照层次结构由上向下进行,直到到达编译器要实例化的类为止。派生类的构造函数可以在执行中调用它可以访问的基类方法、属性和成员。
0 评论:
发表评论