请给一个服务类和委托法的示例的代码实现 (11分)

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
比如一个点类把圆心坐标,以及相关的运算包装起来。这样点类就成了圆类的服务类
圆类则市点类的主类。若要调用圆类的运算move(移动),只需调用点类重相应的运算move,
只需要调用点类重相应的运算move,就可以把圆在x方向移动dx,在y方向移动dy
请用delphi或者java给出实现上例的代码(伪代码也可)
或者您有更好的例子,给出也可。请写上简单注释
 
用类继承不能实现么?
 
?搞错没有,应该点是基类,而园是子类,然后在园的move方法中重构虚方法
 
nod chenlili
 
最初我也觉得这样的关系用继承,但是请看下面这段:

比如多边形由三个或者多个点组成,假如点类是父类,圆类是子类,则意味着
多边形可由多个圆组成,这显然是不对的

 
点类->线条类->曲线类->封闭曲线->圆
这样的继承关系行不行?
我觉得chenlili讲的重构虚方法有一定道理。

换个角度,如果点类作为圆的服务类,
那么圆必然要实现一个方法为GetAllDots(),
然后将执行所有的点的move以移动自己。
class dot
{
...
}
class circle
{
public dot CO;//圆心
public double r;//半径
private Vector GetAllDots();
public move();
}

总感觉有点笨拙。[:)]
 
千中元:
不知道你在看什么。但是很明显点类是圆和多边形的父类。
只需要点的MOVE是个虚方法就行。
其他的小猪和CHENLILI已经说的很清楚了。
 

比如多边形由三个或者多个点组成,假如点类是父类,圆类是子类,则意味着
多边形可由多个圆组成,这显然是不对的


这句话有歧义:
“这显然是不对的”是指“多边形可由多个圆组成”这句不对,还是指“点类是父类,圆类是子类”
这个关系不对?
 
原段:
继承和服务类的对比
通过继承,母类的属性和运算可为子类所用。然而,要利用某个类的属性和运算,
并不一定,也不应该总是使用继承。继承是两个类间非常特殊的关系。只有在确
认子类是母类的一个特殊类时,才应该运用继承;否则,母子之间的关系就很容易
被歪曲了。

以圆和点为例,在设计圆类时,读者或许会说,“扩展点类,加一个半径属性,不
就成了么?”单从运算方面来看,如此的继承是可行的。从点类继承过来的坐标
(x,y)代表圆心,圆心可用运算move(dx,dy)来移动。可是,当有其他的类介入时
,就很快发现,这种继承关系是错误的。圆虽然可以使用点类(point)的坐标(x,y)
作圆,但却成了点的子类。举例,图1-11中的多边形由三个或者更多个点组成。假如
点类是圆的母类,则意味着多边形可由多个圆组成,这显然是不对的。

原文可见《UML 对象设计与编程》P13
希望出版社。 刘润东 著
 
老千:
我觉得你上面说的不对啊,比如说:
你是你爸爸的儿子,你哥哥也是。难道你哥哥就是你爸爸?? FAINT!
这种继承关系没错,但是那个多边形的判断却是错的。
 
圆确实不应该从点派生,就象汽车不应该由轮胎派生。

作者所说“假如点类是圆的母类,则意味着多边形可由多个圆组成,这显然是不对的。”
粗看很没道理,其实很对。昨天老千在QQ上对我转述这话我还把作者骂了一顿,但联系
上下文一看作者完全没错。

 
cheka的第一句很明白了。
能不能找到一个实现服务类的delphi代码?
这个概念还真的接触不多。

 
cheka:
我认为可以这样看:
可以从下到上来论证,例如--
TForm是pointer ,TObject 也是pointer, 所以TForm 是从 TObject继承下来的. 显然成立
轮胎是轮胎,汽车不是轮胎,所以汽车是从轮胎继承下来的说法,显然不成立。
那么圆是不是点呢? 如果是,那么我们可以认为他是从点继承下来的。否则,就不成立继承关系。
数学对圆的定义是:
以定点为圆心、以定长为半径的点的轨迹
呵呵,那大家认为呢? :)
 
>>>>TForm是pointer ,TObject 也是pointer, 所以TForm 是从 TObject继承下来的
我看不出有什么因果关系啊?
如果真的存在有这么一种因果关系,那我是不是可以说轮胎是个东西,汽车也是个东西,
所以汽车可以从轮胎继承下来呢?

我们来看圆的定义:

圆是以定点为圆心、以定长为半径的点的轨迹

回忆一下小学或者初中的语文知识,很明显句子的主干是“圆是轨迹”
而不是“圆是点”,所以如果要给圆找个比较合适的父类,便应该是
“轨迹”或者“shape”
 
我觉得吴剑明引用的数学中圆的公式很能说明问题。
圆还是应从点类继承,而圆心,半径则作为其属性。
 
to 千中元

这种设计方法不是很新潮的概念,甚至可以说是最老土的设计方法之一。

还拿汽车作例子,代码都是大白话,就不注释了

class TCar extends TVehicle
{
private tyre: TTyre;
private engine: TEngine;
public start()
{
engine.start();
tyre.roll();
}
public stop()
{
engine.stop();
tyre.stop();
}
}

 
这个问题很好! 大富翁上好久没有这么精彩的讨论了。

不过我想骂 :千中元
这么多的分数,居然提问只出11分,nnd!
 
to 吴剑明

你问的问题“圆是不是点呢”有非常明确的答案:绝对不是
只能说圆由点构成。
 
拜托楼上的,如果你想看到的是讨论而非骂街,还是请你收敛下自己的言辞先。
 
>>TForm是pointer ,TObject 也是pointer, 所以TForm 是从 TObject继承下来的. 显然成立
不知道,大学里学的数学都哪里去了!

按照这个说法:
W是生物,M也是生物,所以W从M继承下来。显然成立!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部