接口设计实例

来源:互联网 发布:knife party知乎 编辑:程序博客网 时间:2024/05/22 07:37

http://bbs.csdn.net/topics/390985459

 

问题:



这是为了描述各种硬件设备而设计的,应用的时候有点问题。

接口:A类设备 d1 = new 类:1号设备
接口:A类设备 d2 = new 类:2号设备

可是无法直接调用接口:串口或者接口:网口中的方法
暂时有一个变通的办法就是

(d1 as 接口:串口).Port = 10;

(d2 as 接口:网口).Port = 10;
(d2 as 接口:网口).IP ="192.168.0.2";

在这里我想请教两个问题
1、我这样设计接口合理吗?
2、我这样使用接口合理吗?

 

 

 

经典回复1

晕死,用上继承不好吗
什么都用接口吗
这不是典型的为了接口而接口了吗

经典回复2

当你实例化对象时,将引用变量d1d2声明为抽象的接口,就是一种多余的做法。

如果我们声明为

C# code

?

1

2

3

类:1号设备 d1 = new 类:1号设备

类:2号设备 d2 = new 类:2号设备

ABCD.测试最合适的波特率参数(d1)


然后把d1传给一个针对串口的处理方法,例如

C# code

?

1

2

3

4

5

class ABCD

{

    public static void 测试最合适的波特率参数(I串口 x)

    {

           ........


这才是多态的概念。

也就是说,把d1声明为什么“接口”其实根本是多余的,纯粹是滥用“多态”这个概念。

滥用接口,其实就是反过来使用多态。也就是在不需要声明更加抽象类型的变量时去声明,这是不应该的。

    当你写一个针对“1号设备的方法时,你明知道接下来的处理是需要确保是“1号设备才有的操作,你就不应该把对象引用变量声明串口
也就是说,写程序应该尽量具体化才是好的。这是最起码的道理,规矩。

真正会使用抽象的人也不是滥用抽象的。

 

经典回复3

先谢谢各位大佬的回复,下面第一张图是我目前的设计,第二张图是另一种笨办法,帮我看看合理不?

第一图


第二图

经典回复4

楼主你的意是 一种设备可以有多种接口吧,好比一台电视机的输入口有PIN口,HTMI口,这两个口都是为电视输入数据源?

经典回复5

那好办呀,只要两个接口就可以了,不要写那么多一层一层的。就定义
网口电视接口
串口电视接口

然后你的电视
长虹电视(两种接口都有):网口电视接口,串口电视接口// 在这里实现两种接口
{

}
长虹网口电视:网口电视接口
{

}
没必要套那么多层太多层你自己也麻烦。

终极回复6:

好的抽象方式是把设备对接口的依赖抽象,比如IPortAdapter,里面有初始化,读/写之类的方法,所有设备都依赖这个接口。
    不同的接口实现是不同的类,可以由不同的
IPortAdapter实现来隔离。创建具体设备时,先创建具体的接口实现,然后创建对应的IPortAdapter实现,再创建具体设备。

这个应该很好理解吧,你的问题实际上就是要组合两种功能,如果支持多继承,就没有这个问题了。这属于常见问题,不应该想着把功能都在最终的类上实现,而是把不同种类的功能拆开,每种功能有各自的继承树,功能之间通过接口隔离。你这个就是设备和通讯方式解耦,设备依赖通讯方式就可以了。


      如图,这是最简单的方式。
device依赖port,比如要一个使用串口的设备A,那么类似new DeviceA(new SerialPort(/*参数*/))这样构造,也就是功能和功能的组合。在具体的device中,它不应该关心具体的port是什么,只是按照IPort接口提供的功能来收发数据就可以了。

      更复杂的情况也是类似,两个继承树的层次可能更深,中间的关联转换也可能增加,但是基本的模式是不变的。你不能因为
M个功能一和N个功能二,最后就要写M*N个具体实现。而是只有M+N个具体实现,它们之间自由组合。

 

 

总结:

接口设计要实现功能的解耦。

 

 

 

 

 

 

0 0
原创粉丝点击