C#接口问题

.Net技术 码拜 9年前 (2016-03-10) 1114次浏览
为什么接口里的方法都是抽象方法呢?
解决方案

10

接口不能实现方法,只能包含方法申明。不叫“抽象方法”。

20

并不能叫做抽象方法,严格来说那个叫声明。
至于你问为什么是原因是你不清楚他的作用,不知道在什么情况下要用到。所以这个最好的回答就是 “等你用到的时候你就知道了”
不用过于纠结,继续往下学,一定要多写程序。

10

那叫做声明 本身并不需要实现什么功能而是要继承他的类去实现具体的功能
就好比说 本人定义了一个usb接口 而本人在这个接口中声明这个接口是方形的 那么其他需要使用到本人usb接口的东西 你就必须去做成一个方形的而不是圆形的 而你这个usb设备的实体是什么本人并不关心
简单说接口就是定义一个标准并不需要去具体实现
例如说 在程序中本人想为程序增加插件的功能 那么本人就可以写一个接口

public interface IPlugin {
    string GetPluginName();//获取插件的名字
    string Run(string strArgs);//插件的具体执行时候调用的方法
}

定义一个标准 那么其他想给本人程序编写插件的人 就必须按照上面的方式去实现
此时本人就可以编写一个TestPlugin.dll 大致如下:

public class TestPlugin : IPlugin {
    public string GetPluginName() {
        return "TestPlugin";
    }
    public string Run(string strArgs) {
        return "string is [" + strArgs + "]";
    }
}

然后本人主程序运行的时候 就可以去遍历(假设插件目录为./Plugin)Plugin目录下的全部dll文件 假设有一个TestPlugin.dll文件

public static IPlugin GetInterface(string strFileName) {
    Assembly asm = Assembly.LoadFile(strFileName);
    foreach (var t in asm.GetTypes()) {
        if (t.GetInterface("IPlugin") != null) {
            return (IPlugin)Activator.CreateInstance(t);
        }
    }
    return null;
}
IPlugin i = GetInterface("绝对路径\TestPlugin.dll");
假设本人的程序中有一个右键菜单.菜单项.Add(I.GetPluginName(),i/*假设I会保存到菜单项Tag属性中*/);
//然后对应菜单项的点击事件中
private void XXX_Click(object sender,EventArgs e){
    ((IPlugin)(sender as 菜单项).Tag).Run("this is a test");
}

通过接口的方式去调用插件 而不关心插件的具体实现是什么功能
就像PS软件中有很多滤镜插件一样 PS并不需要去关心你插件是什么功能 它只需要定义一个接口 例如:

public interface IPlugin {
    string GetPluginName();//获取插件的名字
    Bitmap Run(Bitmap bmp);//插件的具体执行时候调用的方法
}

它只需要关心 当本人执行这个插件的时候 本人会给你一张图然后你处理完返回一张图给本人就是  至于这个插件的功能是 将人美化还是丑化还是把图形变成模糊那是实现着需要做的事情 而不是定义接口的人需要去做的事情 所以接口并不需要具体的实现 而是需要声明一堆的标准 让别人来实现


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#接口问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)