请教,面向对象的困惑?

我打个比如来说,大家帮忙看看我的想法哪里错了

比如要建立一个论坛,论坛有很多种板块,比如像javaeye的有java板块,ajax板块。
每个板块都一些设置,不同的板块可能有些不同的设置或显示选项。
如果用建关系表,那我可以用一个forum_type的表来存储板块类型,然后用一个forum_type_property来对应不同板块的属性设置。

但如果用对象来建类,那是不是像这样:


public class Forum{
}


JavaForum:

public class JavaForum extends Forum{
}


AjaxForm:

public class AjaxForm extends Forum{
}


但如果这样的话,那我要增加一个种类的板块,岂不是要新建一个类?而不是像关系表那样,新增一个板块就添加相应的数据就可以了……

我知道我的理解是有问题的,请问我的想法错在哪里?
问题补充:
没明白,可能我举的例子有问题
再说一个,比如我有一个动态添加动物的功能,关系数据表是这样的。
一个动物表:
t_animal:
id   name
1    老虎
2    乌鸦

然后一张动物的器官表:
t_animal_part:
id  animal_id part_name
1      1         头
2      1         四肢
3      1         尾巴
4      2         头
5      2         双脚
6      2         尾巴
7      2         翅膀

乌鸦比老虎多了翅膀的部分。
如果我要添加一种动物,比如蛇,那么只要在t_animal表添加一条“蛇”的数据,
然后在t_animal_part表添加相应的不分即可。不用改任何代码。

但如果按照每一种动物一个类的话,比如:

public Tiger extends Animal{
}

那势必是每添加一种动物就要加一个类吧?
比如添加蛇就要添加一个这样的类:

public snake extends Animal{
}


或者说,用类继承都是静态,固定了的,不可在运行时再添加或者删除。
那如果我现在要做一个可以在运行时添加删除动物的功能,是不是就不能用这种面向对象的想法了?


问题补充:

-----------------------------补充分割线--------------------------------

你说的我应该明白。
但不知道你有没有看我的问题补充,那个动物的例子。
我说的就是每个动物都是不同的。比如老虎有四条腿没有翅膀,而乌鸦两条腿有翅膀。
如果按上文说的数据表来建模,那么我添加一种动物只需要保存相应的数据即可。但如果建模成那种继承的类模型,就不是添加数据就可以解决问题了。因为要添加相应的类。

其实我的意思大概应该也相当于你说的那个SpeForum。
按你的说法,那只能是添加相应的类了。

之所以需要继承覆盖,是因为版块之间属性差异,或者功能差异,业务逻辑差异很大,才需要一个这样特殊的,覆盖的方法。正常情况下,所有版块都是一个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()而已。

希望这样介绍你会明白一些