re: 正则表达式30分钟入门教程(第二版) Raylong 2007-10-15 14:39
正在学习中……
re: 正方形不是长方形的终极解决办法 真的遵循LSP? 2007-09-24 10:45
长方形在这里只是举个例子 ,在一个类中改变一个类的属性的方法是很正常的需求,既然原来的结论:
"也就是说正方形不应当看作是长方形的子类。 "
那正方形类就不应改继承长方形类.
re: 正方形不是长方形的终极解决办法 zenny_chen 2007-09-23 20:26
对了。在这里说明一下,上面提到的“Square={a}, Rectangle={a, b}”中Square和Rectangle是指正方形与矩形的边长集,而不是指正方形与矩形的集合。
re: 正方形不是长方形的终极解决办法 zenny_chen 2007-09-23 20:21
我认为将正方形作为长方形的子类本身是一个错误的概念。
实际上我们应该将面向对象中的继承与离散数学的集合论联系起来:
例如有集合A={a, b, c}, B={a, b}。这里显然B是A的子集。然而如果用面向对象的方法将这两个集合构造为两个具有继承关系的类结构的话很显然,应该将集合B作为父类而将集合A作为B的子类。
因此,像public class Square extends Rectangle这种写法欠妥。作为正方形其元素就只要一个边长,而矩形则要两个。因此,根据上面的集合,可以列出Square={a}, Rectangle={a, b}。很显然,应该将正方形作为父类,而矩形作为正方形的子类。(当然,作为集合元素应该为集合类型,而不是组合。不过在软件设计建模上暂且就如此表示)。
在做面向对象的设计时,不应该死板地去看待现有逻辑,尽管我们一直认为正方形是矩形的一个子类(特殊类)。但根据继承的概念——子类继承父类的所有属性和操作这一概念,在很多时候集合中的子集关系与面向对象中的继承关系是相反的。
re: java里的clone[未登录] Eric 2007-09-22 14:16
“而实际情况是,如果没有实现cloneable并重写clone()方法,压根就没clone()方法可以调用,这很奇怪。”
尽信书不如无书啊,说实话core java 7th vol1的翻译实在是不敢恭维。
请看下面的代码:
class Employee implements Cloneable throws CloneNotSupportedException
{
public Employee getEmployee()
{
return (Employee)clone();
}
}
首先要使Employee支持克隆,必须实现Cloneable接口。
genEmployee方法实现的浅克隆跟覆盖Object类的clone方法效果是一样的。
只不过clone这个名字是大家所遵循的,仅此而已。
re: 白马是马吗? Matthew Chen 2007-09-22 09:23
楼上说的在理,原帖是4年前的吧,那时java方兴未艾,完全oo的想法正流行,大家对oo也都还带有不同程度的误解,而今再回首,也许都看得开了。
re: 白马是马吗? 白马 2007-09-22 06:08
扩展不就是特殊情况吗?
re: 正方形不是长方形的终极解决办法 teasp 2007-09-21 17:51
楼上说得很有道理,最关键的问题是我们不知道哪些特性才是一个类的标志。因为现实世界太复杂了,简直不可模仿
re: 正方形不是长方形的终极解决办法 dominobaby 2007-09-21 16:38
继承是泛化,是扩展,结果是:女人不是人,但翠花是人!
作者的看法确实可取,边长似乎确实是方形的标志性。
但是这样的话,哪些作为不可变量很难确定。比如:矮子是不是人?想一个矮子类,就得把高矮也定为不可变量,可是这就跟人的生长特性矛盾了。
re: 正方形不是长方形的终极解决办法 辛科 2007-09-21 10:27
认同楼主
re: 正方形不是长方形的终极解决办法 teasp 2007-09-20 21:49
没看过相关讨论的可以看看这个先:
长方形有二个属性长和宽。并有一个设置长的方法和设置宽的方法,还有一个求面积的方法.
像下面
private int length;
private int width;
public void setLength(int lenght) {
this.length = lenght;
}
public void setWidth(int width) {
this.width= width;
}
public int getArea() {
return this.length * this.width;
}
如果说正方形是长方形的子类。为了保证正方形长和宽相等,那对应于正方形的二设置长宽的个方法就得改成
public void setLength(int lenght) {
this.length = lenght;
this.width= lenght;
}
public void setWidth(int width) {
this.length = width;
this.width= width;
}
那我们想想用户使用时候的情景。 我们都知道长方形的面积等于长与宽的积。那当我们用长方形的时候我们会这样用
Rectangle rectangle = new Rectangle();
rectangle.setLength(5);
rectangle.setWidth(4);
我们想知道面积是多少我们就可以
rectangle.getArea();
得到的是20,当然结果是非常正确的。
但想想如果我们把一个正方形的实例给用户用的时候会怎么样
Rectangle rectangle = new Square(); //注意,这里体显代换原则。用户根本不知道真正的实例是正方形,用户只知道长方形的事情。
rectangle.setLength(5);
rectangle.setWidth(4);
我们想知道面积是多少我们就可以
rectangle.getArea();
得到的结果却是 16 ,这违背了长方形的面积是长与宽之积的原则。用户就不会明白为什么我设置了长是5宽是4得到的答案却是16 ?? 与前提不符
所以正方形不能代替长方形出现在这个地方。
也就是说正方形不应当看作是长方形的子类。
re: 正方形不是长方形的终极解决办法 teasp 2007-09-20 21:33
@黑蝙蝠
呵呵,我不知道你有没有看过关于正方形不是长方形的讨论,网上有的,另外《Java与模式》里面第79页左右就是讲这个问题的。如果你看过相关的内容,应该能明白我要表达的意思了。
re: 正方形不是长方形的终极解决办法 黑蝙蝠 2007-09-20 20:38
makeLovewith你取的方法名字真酷 呵呵
还是没明白你到底想表达什么》??
re: 正方形不是长方形的终极解决办法 GandofYan 2007-09-20 19:55
@teasp
哦,sorry,我一直以为构造方法子类是继承的
我说错了:)
re: 正方形不是长方形的终极解决办法 teasp 2007-09-20 18:45
@GandofYan
兄弟啊,Square只有一个构造方法,你说的这句有语法错误哦。
re: 正方形不是长方形的终极解决办法 GandofYan 2007-09-20 18:29
new Square (4,5);
会有什么结果呢?
re: 微软真恶心 teasp 2007-09-20 17:43
呵呵,楼上误会了哦,这不是政治吧,我是觉得微软那么做不恰当啊
re: 微软真恶心 tsiak 2007-09-20 16:57
搞不明白这有什么恶心的, 想那么多干吗.
一天到晚讲政治累不累啊, 大事小事都往政治上想, 烦不烦啊
re: 正方形不是长方形的终极解决办法 千里冰封 2007-09-20 16:43
呵呵,有意思
re: 微软真恶心 千里冰封 2007-09-20 11:47
呵呵,不要太计效这些了
re: 微软真恶心 teasp 2007-09-20 11:32
china是有别的意思,可是russia没有别的意思啊
re: 微软真恶心 蒋家狂潮 2007-09-20 11:18
我知道china还有另外的意思:陶瓷;它当然不认了,是中国还是陶瓷?所以就默认小写吧,至于其他国家的单词还有没有其他含义就不知道了!
re: java里的clone teasp 2007-09-19 11:56
非常感谢楼上的回复,虽然你说的我知道。应该是我没表述清楚,第一段里的“没法继承”应该是“没有继承”。我的意思是由于其他类都是继承Object,所以应该继承了Object的clone()方法,只是如果这个类没有实现cloneable的话,在调用clone()时会抛异常。而实际情况是,如果没有实现cloneable并重写clone()方法,压根就没clone()方法可以调用,这很奇怪。
re: java里的clone zht 2007-09-19 10:20
不是不能继承Object的clone方法,是如果要想进行复制,必须得实现cloneable接口才可以,这个接口表明类可用clone进行复制
re: java里的clone teasp 2007-09-18 12:07
又看了一下,ArrayList是浅clone
re: 正则表达式30分钟入门教程(第二版) xiaoshifu 2007-08-10 18:59
专业性太强了。。。
re: 正则表达式30分钟入门教程(第二版) shitulian 2007-08-10 18:20
这是什么鸟语啊,这么多,看也看不懂