黑马程序员技术交流社区
标题: 抽象方法 [打印本页]
作者: 李伟斌 时间: 2012-12-3 21:33
标题: 抽象方法
抽象方法
由于抽象类本身表达的是抽象的概念, 因此类中的许多方法并不一定要有具体的实 现, 而只是留出一个接口来作为派生类重载的界面.
一个方法声明中如果加上 abstract 修饰符, 我们称该方法为抽象方法(abstract method).
如果一个方法被声明为抽象的, 那么该方法默认也是一个虚方法, 事实是, 抽象方 法是一个新的虚方法, 他不提供具体的方法实现代码, 我们知道, 非虚的派生类要求通过重 载为继承的虚方法提供自己的实现, 而抽象方法则不包含具体的实现内容, 所以方法声明 的执行体中只有一个分号 ";" .
只能在抽象类中声明抽象方法, 对抽象方法, 不能在使用 static 或 virtual 修饰符, 而且方法不能有任何可执行代码, 只需要给出方法的原型就可以了.
using System;
abstract class Vehicle
{
public int wheels;
public int weight;
public Vehicle(){}
public Vehicle(int wheels,int weight)
{
this.wheels=wheels;
this.weight=weight;
}
public abstract void Speak();
}
class Car : Vehicle
{
public int passengers;
public Car(int wheels,int weight,int passengers):base(wheels,weight)
{
this.wheels=wheels;
this.weight=weight;
this.passengers=passengers;
}
public override void Speak()
{
Console.WriteLine("the car Di-Di");
}
}
class Truck : Vehicle
{
public int load;
public Truck(int wheels,int weight,int load):base(wheels,weight)
{
this.wheels=wheels;
this.weight=weight;
this.load=load;
}
public override void Speak()
{
Console.WriteLine("the truck Ba-Ba");
}
}
class Program
{
static void Main()
{
Car c=new Car(4,3,5);
c.Speak();
Truck t=new Truck(10,5,50);
t.Speak();
}
}
抽象方法在派生类中不能使用 base 关键字来进行访问, 例如,下面的代码在编译时会出错
abstract class A
{
public abstract void F();
}
class B : A
{
public override void F()
{
base.F(); //错误, base.F() 是抽象方法
}
}
还可以利用抽象方法来重载基类的虚方法, 这是基类中虚方法的执行代码就被"拦截"了.
class A
{
public virtual void F()
{
Console.WriteLine("A.F()");
}
}
abstract class B : A
{
public abstract override void F();
}
class C : B
{
public override void F()
{
Console.WriteLine("C.F()");
}
}
类 A 声明了一个虚方法 F(), 派生类 B 使用抽象方法重载了 F(), 这样 B 的派生类 C 就可以重载 F() 并提供自己的实现.
作者: 许庭洲 时间: 2012-12-3 22:20
值得学习ing!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |