[问题] 泛型使用时机/参数传入泛型或是interface

楼主: ccorn (玉米)   2018-09-06 17:28:15
最近新学了泛型很开心,很多东西都可以拿来共用。
但是感觉自己有点走火入魔,用得太多,不知道参数到底要传入泛型还是接口。
写法一
public void DoSomething<T>(T obj)
where T: ISomething
写法二
public void DoSomething(ISomething obj)
之前常常写写法一,现在发现写法二也可以编译和正确执行
不知道写法一和写法二的差别是习惯问题还是根本用错泛型了...
希望有人可以替我解答,感谢!!
如果我真的用错泛型了,也想问一下泛型正确的使用时机是什么?
作者: s4300026 (s4300026)   2018-09-06 19:09:00
一样的方法定义用泛型,一样的方法宣告用接口(鱼,虫,人,菌),执行 “进食” 用接口。 (老师,学生,家长,督察),执行 “用现金付帐” 用泛型。
作者: CloudyWing (孤单ㄉ翼)   2018-09-06 23:35:00
以这范例来说,除非method里面可能会把接口转型成实际型别,不然是2吧以这情况,其实你呼叫起来几乎没差别,如果用接口就不会有转型损耗的,其实用接口就可以了,有转型损耗的就要考虑泛型或是泛型接口我个人觉得没太大差别,然后修正一下,说转型损耗不精准,不用自行做型别检查或额外做转型DoSomething()里面如果只在意ISomething,例如只是呼叫ISomething的某个方法,那就是接口就好但如果你在乎的是ISomething的延伸类别那你可能就必须在method去判断参数是ISomething的哪个延伸类别,或是利用泛型,让使用者可以延后到呼叫时决定,更简单来说是你是在定义method还是呼叫method决定有效的型别来决定是interface还是泛型,感觉越讲越乱.想到一个烂例子可以说明InterfaceA有定义methodAClassA实作MethodA;ClassB继承MethodA,new MethodA上面打错,ClassB继承ClassA,又用new定义同名MethodA如果你今天在意的是InterfaceA,不管传入参数型别是哪个,DoSomething()里呼叫都是实作接口的MethodA那就是作法二,如果你是要让呼叫DoSomething的人可以决定是要呼叫哪个Class的MethodA,那就是作法一当然正常不会用同名Method玩,而是搭配delegate使用
作者: s4300026 (s4300026)   2018-09-07 09:07:00
不好意思,我把你的问题看成 "宣告方法" 时,要用接口还是泛型。如果考虑传入值要用哪一种的话,能用接口,就用接口。我会用泛型的情况,像是方法内会用到实作本体,像是new之类的。
作者: testPtt (测试)   2018-09-07 09:59:00
where T : new()
作者: Litfal (Litfal)   2018-09-07 15:09:00
接口和委派可以给定in或out去指定输入或产出。你要从更高的视野去理解这件事,这是SA的技能之一。
作者: s4300026 (s4300026)   2018-09-07 18:43:00
楼上的意思是,如果是接口,就可以只吞我定义的接口输入,但泛型的目标是我力求吞任何类型的输入是这样解释吗?
作者: CloudyWing (孤单ㄉ翼)   2018-09-08 10:35:00
32楼讲的是泛型接口才有,想知道可以查协变和逆变
作者: EnjoyLife000 (Enjoy_Life)   2018-09-14 23:33:00
泛型是针对物件做处理接口是对物件做的规定经常两个会合在一起用,像是List<T>,里面有很多ToXXX() 然后他会约束where T: 什么接口或是Class但TOXXX都是针对T做操作。 如果今天你的Method里面针对T的类型都会呼叫同一个方法,这就要做接口推文好难回,到此为此..

Links booklink

Contact Us: admin [ a t ] ucptt.com