找回密码
 立即注册
快捷导航

[C#] 接口 interface

[复制链接]
茎肛互撸娃 2023-8-1 01:51:05 | 显示全部楼层

官方:接口是指定一组函数成员而不实现它们的引用类型。所以只能类和结构来实现接口。

以下代码:

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);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-23 01:12

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表