本节课将介绍c#的多态性,其目的包括:
1.了解什么是多态性
2.怎么定义一个虚方法
3.怎么重载一个虚方法
4.怎么在程式中运用多态性
面向对象程式设计中的另外一个重要概念是多态性。在运行时,能通过指向基类的指针,来调用实现派生类中的方法。 能把一组对象放到一个数组中,然后调用他们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果他们都继承自某个类,你能把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就能调用每个对象的同名方法。本节课将向你介绍怎么完成这些事情。
1.清单9-1. 带有虚方法的基类:drawingobject.cs
using system;
public class drawingobject
{
public virtual void draw()
{
console.writeline("im just a generic drawing object.");
}
}
说明
清单9-1 定义了drawingobject类。这是个能让其他对象继承的基类。该类有一个名为draw()的方法。draw()方法带有一个virtual修饰符,该修饰符表明:该基类的派生类能重载该方法。drawingobject类的 draw()方法完成如下事情:输出语句"im just a generic drawing object."到控制台。
2.清单9-2. 带有重载方法的派生类:line.cs, circle.cs, and square.cs
using system;
public class line : drawingobject
{
public override void draw()
{
console.writeline("im a line.");
}
}
public class circle : drawingobject
{
public override void draw()
{
console.writeline("im a circle.");
}
}
public class square : drawingobject
{
public override void draw()
{
console.writeline("im a square.");
}
}
说明
清单9-2定义了三个类。这三个类都派生自drawingobject类。每个类都有一个同名draw()方法,这些draw()方法中的每一个都有一个重载修饰符。重载修饰符可让该方法在运行时重载其基类的虚方法,实现这个功能的条件是:通过基类类型的指针变量来引用该类。
3.清单9-3. 实现多态性的程式:drawdemo.cs
using system;
public class drawdemo
{
public static int main(string[] args)
{
drawingobject[] dobj = new drawingobject[4];
dobj[0] = new line();
dobj[1] = new circle();
dobj[2] = new square();
dobj[3] = new drawingobject();
foreach (drawingobject drawobj in dobj)
{
drawobj.draw();
}
return 0;
}
}
说明
清单9-3演示了多态性的实现,该程式使用了在清单 9-1 和清单9-2中定义的类。在drawdemo类中的main()方法中,创建了一个数组, 数组元素是drawingobject 类的对象。该数组名为dobj,是由四个drawingobject类型的对象组成。
接下来, 初始化dobj数组, 由于line, circle和square类都是drawingobject类的派生类,所以这些类能作为dobj数组元素的类型。 如果c#没有这种功能,你得为每个类创建一个数组。继承的性质能让派生对象当作基类成员相同用,这样就节省了编程工作量。
一旦数组初始化之后,接着是执行foreach循环,寻找数组中的每个元素。在每次循环中, dobj 数组的每个元素(对象)调用其draw()方法。多态性体目前:在运行时,各自调用每个对象的draw()方法。尽管dobj 数组中的引用对象类型是drawingobject,这并不影响派生类重载drawingobject 类的虚方法draw()。 在dobj 数组中,通过指向drawingobject 基类的指针来调用派生类中的重载的draw()方法。
输出结果是:
im a line.
im a circle.
im a square.
im just a generic drawing object.
在drawdemo 程式中,调用了每个派生类的重载的draw()方法。 最后一行中,执行的是drawingobject类的虚方法draw()。这是因为运行到最后,数组的第四个元素是drawingobject类的对象。
小结
目前对多态性有所了解之后,你能在派生类中,实现一个重载基类虚方法的方法。虚方法和重载的派生类方法之间的关系就体现出c#的多态性。
1.了解什么是多态性
2.怎么定义一个虚方法
3.怎么重载一个虚方法
4.怎么在程式中运用多态性
面向对象程式设计中的另外一个重要概念是多态性。在运行时,能通过指向基类的指针,来调用实现派生类中的方法。 能把一组对象放到一个数组中,然后调用他们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果他们都继承自某个类,你能把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就能调用每个对象的同名方法。本节课将向你介绍怎么完成这些事情。
1.清单9-1. 带有虚方法的基类:drawingobject.cs
using system;
public class drawingobject
{
public virtual void draw()
{
console.writeline("im just a generic drawing object.");
}
}
说明
清单9-1 定义了drawingobject类。这是个能让其他对象继承的基类。该类有一个名为draw()的方法。draw()方法带有一个virtual修饰符,该修饰符表明:该基类的派生类能重载该方法。drawingobject类的 draw()方法完成如下事情:输出语句"im just a generic drawing object."到控制台。
2.清单9-2. 带有重载方法的派生类:line.cs, circle.cs, and square.cs
using system;
public class line : drawingobject
{
public override void draw()
{
console.writeline("im a line.");
}
}
public class circle : drawingobject
{
public override void draw()
{
console.writeline("im a circle.");
}
}
public class square : drawingobject
{
public override void draw()
{
console.writeline("im a square.");
}
}
说明
清单9-2定义了三个类。这三个类都派生自drawingobject类。每个类都有一个同名draw()方法,这些draw()方法中的每一个都有一个重载修饰符。重载修饰符可让该方法在运行时重载其基类的虚方法,实现这个功能的条件是:通过基类类型的指针变量来引用该类。
3.清单9-3. 实现多态性的程式:drawdemo.cs
using system;
public class drawdemo
{
public static int main(string[] args)
{
drawingobject[] dobj = new drawingobject[4];
dobj[0] = new line();
dobj[1] = new circle();
dobj[2] = new square();
dobj[3] = new drawingobject();
foreach (drawingobject drawobj in dobj)
{
drawobj.draw();
}
return 0;
}
}
说明
清单9-3演示了多态性的实现,该程式使用了在清单 9-1 和清单9-2中定义的类。在drawdemo类中的main()方法中,创建了一个数组, 数组元素是drawingobject 类的对象。该数组名为dobj,是由四个drawingobject类型的对象组成。
接下来, 初始化dobj数组, 由于line, circle和square类都是drawingobject类的派生类,所以这些类能作为dobj数组元素的类型。 如果c#没有这种功能,你得为每个类创建一个数组。继承的性质能让派生对象当作基类成员相同用,这样就节省了编程工作量。
一旦数组初始化之后,接着是执行foreach循环,寻找数组中的每个元素。在每次循环中, dobj 数组的每个元素(对象)调用其draw()方法。多态性体目前:在运行时,各自调用每个对象的draw()方法。尽管dobj 数组中的引用对象类型是drawingobject,这并不影响派生类重载drawingobject 类的虚方法draw()。 在dobj 数组中,通过指向drawingobject 基类的指针来调用派生类中的重载的draw()方法。
输出结果是:
im a line.
im a circle.
im a square.
im just a generic drawing object.
在drawdemo 程式中,调用了每个派生类的重载的draw()方法。 最后一行中,执行的是drawingobject类的虚方法draw()。这是因为运行到最后,数组的第四个元素是drawingobject类的对象。
小结
目前对多态性有所了解之后,你能在派生类中,实现一个重载基类虚方法的方法。虚方法和重载的派生类方法之间的关系就体现出c#的多态性。