C#接口 抽象类问题

来源:百度知道 编辑:UC知道 时间:2024/09/20 21:13:32
namespace Cftea
{
//定义两个接口
public interface ISwin
{
void Swim();
}
public interface IFood
{
void Cook();
}
//定义一个抽象类
public abstract class Bird
{
public abstract void Fly();
}
//继承自一个抽象类,实现两个接口
public class Duck : Bird, IFood, ISwin
{
//实现ISwim接口
public void Swim()
{
Console.WriteLine("是燕子就会游泳");
}
//实现IFood接口
public void Cook()
{
Console.WriteLine("燕子经常被烧烤,北京烤鸭就很有名");
}
//实现抽象类Bird中的抽象方法
public override void Fly()
{
//throw new Exception("The method or operation is not implemented.");
Console.WriteLine("只有野鸭才会飞");
}
}

// 可以看到,抽象类定义了对象

接口或抽象类是实现多态的一种方式,接口或抽象类声明了方法但提供实现,方法的实现由子类来完成。
将子类实例赋值给基类对象的时候,子类实例并没有发生变化,只是程序中变量对它的引用发生了变化。接口或抽象类定义的变量引用了子类的实例后,调用它的方法就会转化为调用相应子类实例的方法。
在你的例子里,Duck类定义的d是始终没有变化的,而ISwin, IFood, Bird的变量只是对它的引用,引用后,d的属性和方法对外部的可见性发生了改变,跟引用它的对象所属的类或接口一样了,比如s,就只有Swim()方法可见。

类型是基类的类型

不对。

这个b实例已经仍然是前面所定义的Bird类,只是它指向了它子类的实例。

那为什么不能调用子类中的其他方法,是因为编译器不知道它是指向Duck类型的引用变量。只好报错。

所以编译不通过,但是虚拟机知道啊,所以真正在执行的时候,当然是调用子类的方法咯。

这显然错了