如何定义一个属性,但可以让它拥有不同的返回类型,且不同返回类型的属性可以放入同一个列表

问题描述

有如下需求有一个模块,根据实际情况,存在多个输入或输出通道,定义为Channel,且Channel存在属性Value但不同的Channel的Value类型不一致。ChannelA--ValueA--bool--ValueB--int起初的想法是使用泛型Value<T>,则ValueA=newValue<bool>ValueB=newValue<int>如果只有一个Channel,则问题不大,但当我需要更多的Channel,且不同的channel的Value都不同时则出现了问题。当两个Value类型一致,则可以使用List<Value<bool>>这样的实现方式,但类型不一致后,则无能为力。请教一下,有没有更好的抽象方式,或解决方案。

解决方案

解决方案二:
那你就应该定义多种类型的模块,需要哪个用哪个,而不是硬把各种完全不同的东西塞进一个模块里去
解决方案三:
模块不是魔术本来模块化就是为了解决这种乱七八糟的问题而你却非要把一个模块做成一个大厦
解决方案四:
引用1楼Z65443344的回复:

那你就应该定义多种类型的模块,需要哪个用哪个,而不是硬把各种完全不同的东西塞进一个模块里去

恩,其实是可以定义多种类型的模块,每个模块内部的value的类型在模块内部定义。但如果可以抽象出来不是可以更好吗。我想了下面的代码,准备试试publicclassChannelValue{publicboolValueType{set;get;}publicbool_boolValue;publicint_intValue;publicobjectValue{set{if(ValueType){_boolValue=(bool)value;}else{_intValue=(int)value;}}get{if(ValueType){return_boolValue;}else{return_intValue;}}}}

解决方案五:
是谁告诉你"抽象出来就会更好"?这就好比电路里的电阻,电容,电感,本来就应该各是各,不一样的非要把它们集成在一个模块里,通过拨码来设置它到底是当什么用,只会造成混乱明明是不一样的东西,但是从外观上看起来没有什么区别,还要去仔细看拨码到底拨的是啥而你这个也一样不同类型的数据就应该放到不同类型的集合里去,而不是把鸡蛋和垃圾都套上同样的包装然后塞进同一个箱子里
解决方案六:
如果你想返回个object了事的话你不如一开始就把这个模块的输入输出都定义成object算了,还用别的类型往object里装箱干嘛
解决方案七:
编程要从需求出发,不能太教条如果你为了抽象而抽象,把本该2个模块做的工作硬塞进一个模块里去这里可能节约了一半的代码但是在其他调用的地方可能就要复杂10倍
解决方案八:
去了解下协变逆变
解决方案:
这么说吧引用6楼Z65443344的回复:

编程要从需求出发,不能太教条如果你为了抽象而抽象,把本该2个模块做的工作硬塞进一个模块里去这里可能节约了一半的代码但是在其他调用的地方可能就要复杂10倍

了解了您的思路可能我需要两个channel,BoolChannel和IntChannel,都从ChannelBase继承在Module里面可以使用List<ChannelBase>来添加不同类型的channel
解决方案:
引用7楼starfd的回复:

去了解下协变逆变

也许单纯从解决上述问题,这是一个可行的方法,谢谢

时间: 2024-10-29 10:50:29

如何定义一个属性,但可以让它拥有不同的返回类型,且不同返回类型的属性可以放入同一个列表的相关文章

在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的

在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的实例对象 在写JavaScript类定义的时候,大家很可能都写过下面的代码: function A() {} function B() {} B.prototype = new A() 上面这样写是为了让instanceof语句能起作用.举个例子: 1.不重写子类的prototype属性 b = new B(); b instanceof B //return true b instanceof A // retu

怎样在java中定义一个抽象属性

Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给子类.由于Java不支持抽象属性,如果你试图将类属性标记为抽象,将会得到一个编译时错误. 在本教程中,我们将介绍两种定义抽象属性的方法,这些抽象属性可以由子类进行设置,而且不使用Abstract 关键字. 实用案例 假设我们想要实现一个记录事务的日志模块,用来记录特定事务的信息.我们希望这个模块是抽象的,这样我们可以实现不同的日志记录方式,例如:记录到文件或数据库中. 我们的引擎使用预定义的分隔符来连接日志中的信息,并存储在一个

第三节--定义一个类 -- Classes and Objects in PHP5 [3]

object|php5 /*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! +--------

PHP 5.0对象模型深度探索之定义一个类

当你声明一个类,你需要列出对象应有的所有变量和所有函数-被称为属性和方法.列表1中显示了一个类的构成. 注意在大括号({})内你只能声明变量或者函数.列表2中显示了如何在一个类中定义三个属性和两个方法. 列表1 class Name extends Another Class { Access Variable Declaration Access Function Declaration } 列表2 //定义一个跟踪用户的类 class User { //属性 public $name; pr

新手求助 定义一个name 如何输入图形类的名字输出相应的类的内容

问题描述 新手求助 定义一个name 如何输入图形类的名字输出相应的类的内容 设计三个图形类:Circle(圆).Rectangle(矩形).Triangle(三角形): 1.Cirlce类基本信息:圆心坐标.半径: Rectangle类基本信息:长.宽: Triangle类基本信息:三个顶点坐标: 其中:成员变量为private属性,成员函数为public属性: 2.每个图形类有计算图形的面积GetArea(),显示图形的基本信息函数Show(): 现在我的代码不能实现 输入名字circle

c++-C++可以在类中定义一个类吗?

问题描述 C++可以在类中定义一个类吗? 比如像下面这样: 解决方案 完全可以注意:内部类可以访问外部类的私有成员,外部类不能访问内部类的私有成员! 解决方案二: 可以呀,就像在结构体里申明结构体一样,不过好像通常不这样用. 解决方案三: 嵌套类的概念,相当于一个内部类. 解决方案四: 可以的,不过看起来比较别扭 解决方案五: 可以,嵌套类有以下性质: 一.**可见性**嵌套类对于外围类: 嵌套类仅仅是声明在外围类内部的类型,而不是外围类的成员 外围类不具备嵌套类所定义的成员 对于外围类来说,嵌

不确定数据多少的类-c++如何定义一个类中的数据不确定的类

问题描述 c++如何定义一个类中的数据不确定的类 比如 class s { public: s(int a) {b=a;} ... private: int b; int w[b]; ..... }; 我试着用new,但是还是不成功,那么有什么办法可以使类中的数据多少由外部确定呢? 这是我在重载[]成员访问运算符 和重载()函数调用运算符时遇到的问题. 解决方案 用静态数组的时候,必须同时指明数组的大小,比如int w[10],这是因为静态数组在栈上分配,在编译的时候就已经分配好内存了.楼主可以

定义一个变量,怎么能够让它在两个.aspx中通用。急急急啊

问题描述 做了一个注册页,当所有注册内容填完以后,点击注册,跳到另一个页面,代码如下:protectedvoidbtnOK_Click(objectsender,EventArgse){if(Page.IsValid){stringusername=txtUsername.Text;stringpassword=txtPwd.Text;stringtruename=txtRePwd.Text;stringsex=RadioSex.SelectedValue;intage=Convert.ToIn

C# winform 如何定义一个公用变量

问题描述 我是新手感觉C#定义公用变量的方法跟其他语言有点不同1.如何定义一个公用变量,这个变量可以在所有的表单中使用,比如一个连接sql数据的SqlConnection类型的变量2.向数据库中执行了查询之后,如果在要执行修改,更新或是插入操作,是不是每次都要重新定义一个SqlCommand? 解决方案 解决方案二:如果是想在整个工程都使用的话,你可以专门用一个类来处理全局的变量和方法,并用static关键字,让变量和方法都是静态的,这样,在整个工程中,都可以通过这个类来引用.当然,你也可以定义