官方:接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。
以下代码:
class CA{
public string Name;
public int Age;
}
class CB{
public string First;
public string Last;
public double PersonsAge;
}
static void PrintInfo(CA item){
Console.WriteLine($"Name:{item.Name}, Age:{item.Age}");
}
CA a = new CA() { Name = "zhangsan", age = 18};
PrintInfo(a);
只要传入的是CA类型的对象,PrintInfo方法就能工作正常。但如果传入的是CB类型的对象(同样见上面的代码),就不行了。假设PrintInfo方法中的算法非常有用,我们想用它操作不同类的对象。
现在的代码不能满足上面的需求,原因有很多。首先,PrintInfo的形参指明了实参必须为CA类型的对象,因此传入CB或其他类型的对象将导致编译错误。但即使能克服这个障碍,使其接受CB类型的对象还是会有问题,因为CB的结构与CA的不同。其字段的名称和类型与CA不一样,PrintInfo对这些段一无所知。
能不能创建一个能够成功传入PrintInfo的类,并且不管该类是什么样的结构,PrintInfo都能正常处理呢?接口使这种设想变为可能。
// 声明接口
interface IInfo
{
string GetName();
string GetAge();
}
class CA: IInfo{ // 声明实现接口的CA类
public string Name;
public int Age;
// 在CA类中实现两个接口方法
public string GetName() { return Name; }
public string GetAge() { return Age.ToString(); }
}
class CB : IInfo // 声明实现接口的CB类
{
public string First;
public string Last;
public double PersonsAge;
// 在CB类中实现两个接口方法
public string GetName() { return First + " " + Last; }
public string GetAge() { return PersonsAge.ToString(); }
}
static void PrintInfo(IInfo item)
{
// 这里的参数类型变更为接口
Console.WriteLine($"Name:{item.GetName()}, Age:{item.GetAge()}");
}
void Main()
{
CA a = new CA() { Name = "zhangsan", Age = 18 };
CB b = new CB() { First = "Li", Last = "Si", PersonsAge = 38 };
PrintInfo(a);
PrintInfo(b);
}
|