c#学习笔记 020 (继承的类型、实现继承)

2009年1月31日星期六

c#学习笔记 020 (继承的类型、实现继承)

一、继承的类型。

实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。在给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承是非常有效的。

接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。

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 评论:

      发表评论