继承在这种情况下有用吗?

时间:2013-11-23 12:28:38

标签: java class gis class-diagram

我想研究GIS,我正处于构思阶段,我有这些道路(道路)

  • 公路→小学
  • 公路→中学
  • 公路→LivingStreet
  • 公路→第三纪
  • 公路→住宅
  • 公路→未分类
  • 公路→高速公路
  • 公路→步骤
  • 公路→人行道
  • 公路→服务
  • 公路→行人
  • Highway→SecondaryLink
  • Highway→PrimaryLink
  • 公路→主干
  • 公路→路径
  • Highway→TertiaryLink
  • 公路→赛道
  • 公路→自行车道
  • 公路→公路
  • Highway→MotorwayLink

我正在使用Java,我的问题是:为每个人创建一个扩展抽象类(“方式”)的类是否更可取?或者最好只在一个类中创建主题并使用属性int highwayType来区分它们,知道每个属性都有自己的绘图功能和缩放级别的绘图?

4 个答案:

答案 0 :(得分:4)

不要使用整数来定义类的类型。面向对象的编程使其变得更加容易。

你应该有一个抽象类 Highway ,你的所有特定类都继承自,例如class PrimaryHighway extends Highway。抽象类将声明一个方法render(),然后所有子类都会覆盖它们的特定行为。

这样,您可以对子类中的实际行为进行建模 - 当使用高速公路对象时,您不必找出您正在使用的类,因为所有高速公路都支持render()

您还可以创建一个所有类都实现的接口Drawable。接口需要在实现它的每个类中定义方法render()。好处是所有可绘制的东西都可以使用这个界面,你不必为所有非高速公路上的可绘制东西重复做同样的事情。

答案 1 :(得分:2)

通过此链接
http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

您的班级应该只有单一责任。使用整数,否则将使测试和维护变得困难。你应该继承。

答案 2 :(得分:1)

另一方面,也许您想要提升一个级别,而不是尝试在某个类层次结构中对每个可想到的地理要素类型进行建模。我倾向于避免创建大规模的类层次结构,特别是在没有多重继承的Java中。你已经有20个班级专门用于高速公路。我认为,在这条道路上,疯狂等待着你。

您列出了一系列功能,这些功能似乎反映了OpenStreetMap提供的一些功能。为什么不直接查看现有基于Java的OSM功能的来源,例如JOSM, the Java OpenStreetMap编辑器,并向多年来一直在使用它的人学习如何将地理要素建模为objects上的属性集合。

更好的是,不是发明自己的基于Java的GIS,而是学习GIS,Java或面向对象编程可能具有指导意义 - 为什么不选择现有项目并为改进那个项目做出贡献?{{ 3}}

答案 3 :(得分:1)

你可以下载OReilly Head First Design Patterns.pdf这是一本非常好的设计模式书,并在第一章中完全讲述了你的案例。