※ 引述《luoqr (.....)》之铭言:
: 假设我有一个Class A 他包含一个叫 B 的这个接口来帮他做事情
: class A{
: B b ;
: }
: b 的实体可能是 C or D
: class C implements B
: class D implements B
: B 则提供一个function叫画画() 然后 C 实作画圈圈 D 实作画框框
: 现在我要来使用A这个类别
: 我会先指定要用哪个B实体: a.setB( new C() ) ; 或 a.setB( new D() ) ;
: 如果 C 在实作画圈圈的时候需要某个参数 o D实作画框框需要另一个参数 x
: o 和 x 的型态又不是相同的
: ex:
: c.画画(){
: 圈圈中间显示名字, 名字是一个变量
: }
: d.画画(){
: 匡匡中间显示日期, 日期也是一个变量
: }
: 这样我要怎么把不同的参数给 A 好让 A 去呼叫 b.画画() 时
: 可以把不同的参数给真正的实体 C or D?
: 还是说 只有在决定实体是谁的时候这个时间点给会比较适当?
: ex: new C("要显示的名字") or new D( new Date() )
: 如果是在决定实体是谁的时候给参数
: 那当 A 里面的接口不只有 B 这一种 可能有 X,Y,Z...
: A 提供了一个统一的 function 去操作 B,X,Y,Z 这些接口的function
: ex:
: a.function(){
: b.画画() ;
: x.纪录() ;
: y.传送图片() ;
: }
: 会不会变成这些接口提供的function都不需要传入参数
: 因为在决定实体的时候就都给好了?
: 是觉得function参数都是void挺怪的 不知道这样的设计好不好? @@
: PS. A的角色就有点像控制中心 去操作不同的接口....
: 只是在于不同的接口底下的实体可能需要的参数不同形态时有点难传递...@@
在这里您说 A 的角色是控制中心,
去使用 B (某个 Action) 跟任意其他种的 X, Y, Z 功能。
我觉得较不明确的是 B, X, Y, Z 的操作对象都是同一个 Subject 吗?
如果是的话,那不就只需要在它直接实作需要的 function 就好了?
class Subject{
function void b(m, n);
function void x(o);
function void y(s, t);
}
有什么特殊的理由,要将 Subject 本身的责任委外出来呢?
如果硬要统一,那就会像:
class Subject {
function Object execute(Action, ...args)
}
abstract class Action {
function execute(Subject, ...args)
}