我本意是顶层接口是电器接口,下层接口是电视机接口、冰箱接口,再往下走就是具体的海尔电视机、长虹电视机这样的结构。
但是海尔电视机是VGA接口的,长虹电视机是HDMI接口的,所以我这样设计了。但这样使用起来很不方便,如果我专门给海尔电视机VGA做一个接口,这个接口继承自电器接口和VGA接口,那么可以解决这些问题,但我觉得更多余。

解决方案 »

  1.   


    再一个,一个类继承多接口的话。
    实例化这个类的时候,就不能按我想的 【接口 x=new 类】这样调用了。
      

  2.   

    类:1号设备 d1 = new 类:1号设备
    类:2号设备 d2 = new 类:2号设备或者接口:串口 d1 = new 类:1号设备
    接口:网口 d2 = new 类:2号设备滥用抽象是不对的。既然你的d1被当作串口用,你的被当作网口用,就不应该再空洞地使用什么更抽象的概念,而应该具体化。
      

  3.   

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

  4.   


    我本意是顶层接口是电器接口,下层接口是电视机接口、冰箱接口,再往下走就是具体的海尔电视机、长虹电视机这样的结构。
    但是海尔电视机是VGA接口的,长虹电视机是HDMI接口的,所以我这样设计了。但这样使用起来很不方便,如果我专门给海尔电视机VGA做一个接口,这个接口继承自电器接口和VGA接口,那么可以解决这些问题,但我觉得更多余。当你实例化对象时,将引用变量d1、d2声明为抽象的接口,就是一种多余的做法。如果我们声明为类:1号设备 d1 = new 类:1号设备
    类:2号设备 d2 = new 类:2号设备
    ABCD.测试最合适的波特率参数(d1)然后把d1传给一个针对串口的处理方法,例如class ABCD
    {
        public static void 测试最合适的波特率参数(I串口 x)
        {
               ........
    这才是多态的概念。也就是说,把d1声明为什么“接口”其实根本是多余的,纯粹是滥用“多态”这个概念。
      

  5.   

    应该可以的,使用的时候判断一下是否为某接口:
    if(d1 is 串口) (d1 as 串口).xxx = yyy;
      

  6.   


    我本意是顶层接口是电器接口,下层接口是电视机接口、冰箱接口,再往下走就是具体的海尔电视机、长虹电视机这样的结构。
    但是海尔电视机是VGA接口的,长虹电视机是HDMI接口的,所以我这样设计了。但这样使用起来很不方便,如果我专门给海尔电视机VGA做一个接口,这个接口继承自电器接口和VGA接口,那么可以解决这些问题,但我觉得更多余。当你实例化对象时,将引用变量d1、d2声明为抽象的接口,就是一种多余的做法。如果我们声明为类:1号设备 d1 = new 类:1号设备
    类:2号设备 d2 = new 类:2号设备
    ABCD.测试最合适的波特率参数(d1)然后把d1传给一个针对串口的处理方法,例如class ABCD
    {
        public static void 测试最合适的波特率参数(I串口 x)
        {
               ........
    这才是多态的概念。也就是说,把d1声明为什么“接口”其实根本是多余的,纯粹是滥用“多态”这个概念。老师你好,你说的这个我暂时吸收不了,我还得再想想再试试,先谢谢你。
      

  7.   

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

  8.   

    这个程序的写法就是类:1号设备 d1 = new 类:1号设备
     类:2号设备 d2 = new 类:2号设备d1.Port = 10;d2.Port = 10;
    d2.IP ="192.168.0.2";这是很简单的程序。你因为在声明 d1、d2 时过分抽象了,脱离了实际类型,才会产生后3句话的你得那种问题。
      

  9.   

    我其实没有考虑你的接口、抽象父类的定义是否有问题,我也没有管你有多少层定义。我只是告诉你,声明d1、d2变量时,不要滥用抽象类型。你能确定当前的代码的“最具体的类型”是什么,就用什么。我看不出你定义接口:A类设备 d1 = new 类:1号设备
     接口:A类设备 d2 = new 类:2号设备
    时这个使用两个接口是出于什么目的,我觉得你是盲目的!可能是因为这样写更“时髦”。因为,如果要调用串口的Port,或者调用网口的Port,都不需要你那种写法。
      

  10.   


    我之所以选择时髦的写法有一个原因在【类:1号设备】【类:2号设备】等等很多类的下面还有继承的子类
    这些类叫【类:X项目】【类:Y项目】
    然后我用接口的显示实现隐藏了一些基础操作,直接展示X项目需要用到的所有函数
    这才选择了更炫的写法。我知道您擅长串口编程
    在【类:1号设备】【类:2号设备】仅包含发送、接受数据这些函数,但需要开发人员了解设备的通讯规约,发什么发到哪里才相应什么功能,这太繁琐,所以有了下面的子类【类X】
    在【类:X项目】【类:Y项目】中就写好了走、停、跑这些函数,开发人员不需要知道调用【走】这个函数具体发送了什么东西。您能理解我的处境吗?
      

  11.   


    我之所以选择时髦的写法有一个原因在【类:1号设备】【类:2号设备】等等很多类的下面还有继承的子类
    这些类叫【类:X项目】【类:Y项目】
    然后我用接口的显示实现隐藏了一些基础操作,直接展示X项目需要用到的所有函数
    这才选择了更炫的写法。我知道您擅长串口编程
    在【类:1号设备】【类:2号设备】仅包含发送、接受数据这些函数,但需要开发人员了解设备的通讯规约,发什么发到哪里才相应什么功能,这太繁琐,所以有了下面的子类【类X】
    在【类:X项目】【类:Y项目】中就写好了走、停、跑这些函数,开发人员不需要知道调用【走】这个函数具体发送了什么东西。您能理解我的处境吗?补充一下:
    我也不能在【类:1号设备】【类:2号设备】中讲发送、接收数据这些函数用protected声明
    因为这种类库还需要留给更高级的程序员来调用,直接操作硬件设备
      

  12.   

    这个应该很好理解吧,你的问题实际上就是要组合两种功能,如果支持多继承,就没有这个问题了。这属于常见问题,不应该想着把功能都在最终的类上实现,而是把不同种类的功能拆开,每种功能有各自的继承树,功能之间通过接口隔离。你这个就是设备和通讯方式解耦,设备依赖通讯方式就可以了。
    如图,这是最简单的方式。device依赖port,比如要一个使用串口的设备A,那么类似new DeviceA(new SerialPort(/*参数*/))这样构造,也就是功能和功能的组合。在具体的device中,它不应该关心具体的port是什么,只是按照IPort接口提供的功能来收发数据就可以了。更复杂的情况也是类似,两个继承树的层次可能更深,中间的关联转换也可能增加,但是基本的模式是不变的。你不能因为M个功能一和N个功能二,最后就要写M*N个具体实现。而是只有M+N个具体实现,它们之间自由组合。
      

  13.   

    那个就是快速表达思路的画图工具,叫yEd,免费的。我不用能导出代码的那种复杂设计工具,曾经用过很多种,发现效果并不好。