一个类,可以继承自一个普通类,继承它的成员变量和方法;也可同时继承自 一个接口,继承接口的方法并完成定义。
using System;
namespace Interface
{
interface IAct{
void Act();
}
class Human {
string name;
float length;
public Human(string n,float l)
{
name = n;
length = l;
}
public void Describe()
{
Console.WriteLine("My name is {0},my length is {1}",name,length);
}
}
class Man:Human,IAct {//一个类,可以继承自一个普通类,也可同时继承自一个接口
public Man(string n,float l):base(n,l)
{ }
public void Act()//对接口里的方法定义
{
Console.WriteLine("my limbs move and my mouth open and close");
}
}
class Woman:Human,IAct{//一个类,可以继承自一个普通类,也可同时继承自一个接口
public string characteristics;//在继承之外,也可再定义新成员
public Woman(string n,float l):base(n,l)
{
characteristics = "My temperament is special";
}
public void Act()//对接口里的方法定义
{
Console.WriteLine("My limbs move and tooth tear");
}
}
class Program{
public static void Main(string[] args)
{
IAct iA1,iA2;
iA1 = new Man("gyg",171);
iA2 = new Woman("gyy",165);
iA1.Act();
iA2.Act();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
在上面的代码里面,不仅阐述清楚了一个类继承自普通类和接口的做法。还有一个神奇的魔法:同一种对象,都是IAct对象,调用同一种方法Act() 。但是执行的情况却完全不一样。
了解了这个魔法的原理,就知道它其实是很合理的。
因为Man类和 Woman类都是继承自IAct类。那么一个Man或Woman对象自然也是一个IAct对象。因此将对象声明成IAct类型,但是赋给它的却是Man或者Woman对象,在后者,IAct中的方法已经个性化定义过了。因此,调用同一个方法,但是执行情况却不同
要注意的是,一个接口类对象,只能执行接口里的方法,即使返给它的是子类的对象。只要它的type是接口类,那么,它就只能执行接口里的方法。如果我有幸你读到这篇文章,你可以对已经赋了子类对象的接口类对象使用子类才有的方法,看编译器是如何报错的。谢谢