6. 抽象类
问题越上层越抽象,抽象类定义如下:
Abstract class 类名 {
…/抽象类的成员定义 }
抽象方法: public abstract void 方法名(方法参数);
抽象方法也是一种虚方法,在派生类中必须通过方法重写来覆盖。抽象类不能实例化,所以不能用new来生成实例。一个抽象类必须包含抽象方法或者抽象属性。在 其派生类中,不允许使用base关键字访问基类中的抽象方法。 示例代码和运行结果:
namespace InterfaceTest {
classAbstractTest { }
abstractclasstemplate {
protectedint a; protectedint b;
public template(int a, int b) { this.a = a; this.b = b; }
publicvoid getresult() {
add(a, b); sub(a, b); mul(a, b); div(a, b); Console.ReadLine(); }
abstractprotectedvoid add(int a, int b); abstractprotectedvoid sub(int a, int b); abstractprotectedvoid mul(int a, int b); abstractprotectedvoid div(int a, int b); }
classcaculator : template {
public caculator(int a, int b) : base(a, b) { }
protectedoverridevoid add(int a, int b) { int r = a + b;
Console.WriteLine(\, a, b, r); }
protectedoverridevoid sub(int a, int b) { int r = a - b;
Console.WriteLine(\, a, b, r); }
protectedoverridevoid mul(int a, int b) { int r = a * b;
Console.WriteLine(\, a, b, r); }
protectedoverridevoid div(int a, int b) {
if (b == 0) {
Console.WriteLine(\); } else
{ int r;
r = a / b;
Console.WriteLine(\, a, b, r); } } }
publicclassCCff {
publicstaticvoid Main() {
caculator cc = newcaculator(50, 2); cc.getresult(); }
} }
7.密封类和密封方法
是C#提供了阻止类被继承的技术。定义密封类使用sealed修饰符,这种被定义的类不能派生出其他类,也即它不能被继承。定义密封类的一般格式为:
Sealed class 类名 {
…/类成员定义 }
密封类一定不能作为抽象类,因为抽象类是用来派生其他类的。
同理,密封方法可以阻止在派生类中对该方法进行重载。密封方法必须对基类的虚方法进行重写,提供具体的实现方法。 示例代码:
using System; class A {
public virtual void F() { Console.WriteLine(\ }
public virtual void G() { Console.WriteLine(\ } }
class B: A {
sealed override public void F() { Console.WriteLine(\ }
override public void G() { Console.WriteLine(\ } }
class C: B {
override public void G() {
Console.WriteLine(\ } }
类B提供两个重写方法:具有sealed修饰符的F方法和不具有此修饰符的G方法。通过使用sealed修饰符,B就可以防止C进一步重写F。
8.继承
C#只支持单继承。派生类直接继承其基类成员,并隐式包含其直接基类中除构造函数和析构函数外的所有成员。继承具有可传递性。
派生类可在其基类的基础上添加新成员,但它不能删除所继承的成员和定义。在派生类中,可以通过定义与所继承的基类成员具有相同名称或标识符的新成员来隐藏所继承的成员,从而使所继承的成员在派生类中不可被访问。
9.接口
接口可以是命名空间或类的成员,并且可以包含下列成员的签名:方法、属性、索引器和事件。接口是实现多继承,定义了类必须做什么,而不是怎么做。
一个接口可从一个或多个基接口继承。当基类型列表包含基类和接口时,基类必须是列表中的第一项。要实现接口的类必须实现接口中的所有成员,但类还可以定义自己的额外成员。
在接口成员的声明中不需要任何访问修饰符,而在类中相应的接口成员实现定义中则都用public修饰符。
接口定义: [代码属性][修饰符] interface 接口名[:基接口列表]
{ …/接口成员定义 }
一个类实现多个接口的代码如下所示:
namespace InterfaceTest {
classIMClass { }
publicinterfaceIshape {
double Area(); double GramLength(); int Sides { get; } }
publicinterfaceIShapePlay {
void play(); }
publicclassSquare: Ishape,IShapePlay {
privateint sides; publicint SideLength;
public Square() { sides = 4; }
publicint Sides { get
{ return sides; } }
publicdouble Area() {
return (double)(SideLength * SideLength); }
publicdouble GramLength() {
return (double)(SideLength * sides); }
publicvoid play() {
Console.WriteLine(\计算正方形结果如下:\); Console.WriteLine(\边长:{0}\, this.SideLength); Console.WriteLine(\边数:{0}\, this.Sides); Console.WriteLine(\面积:{0}\, this.Area()); } }
publicclassaoo {
publicstaticvoid Main() {
Square sq = newSquare(); sq.SideLength = 8; sq.play(); Console.ReadLine(); } } }