我打个比如来说,大家帮忙看看我的想法哪里错了
比如要建立一个论坛,论坛有很多种板块,比如像javaeye的有java板块,ajax板块。
每个板块都一些设置,不同的板块可能有些不同的设置或显示选项。
如果用建关系表,那我可以用一个forum_type的表来存储板块类型,然后用一个forum_type_property来对应不同板块的属性设置。
但如果用对象来建类,那是不是像这样:
public class Forum{
}
public class JavaForum extends Forum{
}
public class AjaxForm extends Forum{
}
public Tiger extends Animal{
}
public snake extends Animal{
}
之所以需要继承覆盖,是因为版块之间属性差异,或者功能差异,业务逻辑差异很大,才需要一个这样特殊的,覆盖的方法。正常情况下,所有版块都是一个forum对象。
你举的,老虎跟乌鸦的不同这样的理解就错了。
老虎跟乌鸦都可以归结为animal对象,他们有腿跟翅膀的不同,那是对象的属性不同,就像老虎跟乌鸦的名字不一样,不同的对象肯定有不同的熟悉。
对于业务来说
老虎 = new Animal(1);
乌鸦 = new Animal(2);
老虎.腿=4
老虎.翅膀=0
乌鸦.腿=2
乌鸦.翅膀=2
本质,都是Animal。属性不同而已
呵呵,不是这样的。。
这个继承关系应该体现在数据库上面而不是代码里面。。
你的数据库表里面应该是这样的:
forumid forumname xx xx
1 java
2 ajax
对于数据库表的设计,你可以下载一些比较好的论坛的程序,像discuz,phpbb,你只要看他们数据库表是如何设计的就可以了,不用深入php。从他们的数据库表设计,可以学习到很多东西。
你所说的对象没有错,包括你将一个版块理解成一个对象也是对的。
问题在于,这个面向对象的实体,其实针对的是数据库的设计。你所说的这些对象,是转化为数据库的实体。
在程序代码上,所谓的不同的论坛,比如java论坛,ajax论坛,应该是理解成论坛对象,他们拥有不同的属性。
包括你的代码,也是对的,但是,正常情况下,一个论坛的模式应该都是一样的,除非你一个分论坛的确要求一个比较差异化的功能。
也就是说,你可以用这样的extends的写法,但是几乎所有的逻辑都在Forum里面实现了,你的那个继承的之类,正常情况下是空的。
如果有的子论坛有特别的业务逻辑,那你才需要在你继承的类覆盖父类的方法。
可能我说的还是不清楚。
来解说下这个问题:
[quote]那我要增加一个种类的板块,岂不是要新建一个类?而不是像关系表那样,新增一个板块就添加相应的数据就可以了……[/quote]
你在Forum这个父类里面实现掉几乎所有的方法,因为你大部分的版块操作方法方式上面应该都是一样的。如果你要新增一个种类的版块,数据库中加一条纪录就可以了。所有的版块都是Forum,调用一个新的版块,你就
Forum f = new Forum(id),这样就行。
比如你有5个版块,a b c d e。那这5个你调用时候都是生成一个forum对象。
这时候,比如你遇到一个问题,你的e版块需要一个很特殊的功能,这个时候,你才需要写一个这样特殊的代码
SpeForum extends Forum,然后覆盖掉父类的方法,对于e版块
你就
SpeForum e = new SpeForum(id)。而除了e之外,所有的forum都是 new Forum()而已。
希望这样介绍你会明白一些