Posted on 2008-04-10 21:20
火山工作室 阅读(63)
评论(0) 编辑 收藏 引用 网摘 所属分类:
高职IT教育
(1)父类型子对象运行某个方法,如果是虚方法则调用子类中方法,否则调用的是父类中的方法。
public class Animal //定义一个Animal类
{
public virtual void Say() //虚方法
{
Console.WriteLine("Yum!");
}
public void Sleep() //一般方法
{
Console.WriteLine("ffff");
}
}
public class Cat:Animal //Cat继承于Animal
{
public override void Say() //方法覆盖
{
Console.WriteLine("喵,喵,喵");
}
new public void Sleep() //方法重写
{
Console.WriteLine("Zz...woof.Oo!");
}
}
public class Dog:Animal //Dog继承于Animal
{
public override void Say() //方法覆盖
{
Console.WriteLine("汪,汪,汪");
}
}
class test
{
public static void Main()
{
Cat cat = new Cat();
Dog dog = new Dog();
Animal a = new Animal();
cat.Sleep();//运行结果是什么?
TestAnimal(cat);//运行结果是什么?
TestAnimal(dog);//运行结果是什么?
TestAnimal(a);//运行结果是什么?
}
public static void TestAnimal(Animal a)
{
a.Say();
a.Sleep();
}
}
|
问题:
(1)请分别写出:
cat.Sleep();//运行结果是什么?
TestAnimal(cat);//运行结果是什么?
TestAnimal(dog);//运行结果是什么?
TestAnimal(a);//运行结果是什么?
(2) cat.Sleep();和 TestAnimal(cat);中的Sleep()结果为什么不一样?
(3) public static void TestAnimal(Animal a)
{
a.Say();
a.Sleep();
}
该函数中参数a都是Animal类型,那么a.Say();和 a.Sleep();两个函数运行的是否是Animal类中的Say()和Sleep()?
(2)一道面试题
using System;
class A
{
public A()
{
PrintFields();---------------------------①
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()---------------------------------②
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine( "x={0},y={1} ",x,y);--------------③
}
}
|
当使用new B()创建B的实例时,产生什么输出?
(3)抽象方法和虚方法的区别
抽象方法:使用abstract关键字
public abstract bool Withdraw(…);
l 抽象方法是必须被派生类覆写的方法。
l 抽象方法是可以看成是没有实现体的虚方法
l 如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
虚方法:使用virtual关键字
public virtual bool Withdraw(…);
l 调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
l 虚方法可以有实现体
若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法;一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。
虚函数的限制:
1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.
2.静态成员函数不能是虚函数.
3.内联函数不能是虚函数.
4构造函数不能是虚函数.
5.析构函数可以是虚函数.
简单点说,抽象方法是需要子类去实现的。虚方法是已经实现了,子类可以去覆盖,也可以不覆盖(取决于需求)。
如:
public abstract class AUser
{
public abstract UserInfo getUser();
public virtual void Save(UserInfo info)
{
//实现保存的功能
}
}
public class UserSqlServer:AUser
{
public override UserInfo getUser()
{
//一定要实现的,抽象类只给了抽象方法
}
//假设抽象类针对SqlServer实现的功能,这里不需要实现了.
}
public class UserOracle:AUser
{
public override UserInfo getUser()
{
//一定要实现的,抽象类只给了抽象方法
}
//假设抽象类针对Oracle实现的功能
public override void Save(UserInfo info)
{
//覆盖抽象类中的Save方法
}
}
|