接口设计实例

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

接口: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:
当你实例化对象时,将引用变量d1、d2声明为抽象的接口,就是一种多余的做法。

如果我们声明为:
类:1号设备 d1 = new 类:1号设备
类:2号设备 d2 = new 类:2号设备
ABCD.测试最合适的波特率参数(d1)

然后把d1传给一个针对串口的处理方法,例如
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值