如何避免将相同的实现代码重用于接口?

时间:2011-04-14 23:37:43

标签: actionscript-3 oop design-patterns language-agnostic interface

首先,我为“又一个界面问题”道歉。我认为这个可能值得一提,因为这是一个奇怪的问题。我正在使用的项目使用了Actionscript 3,但这更像是一个普遍的OOP问题。

情况如下:

我有一个已经从基类继承的类;它是电子游戏中的一个对象。 (让我们说这是一艘宇宙飞船。)在我的游戏中,我希望同时在屏幕上有许多太空飞船,所以我决定使用链表结构创建一个对象池。

逻辑上,因为类Spaceship已经从基类继承,所以我将使用接口来定义与链表有关的方法。另外,这样做可以让我将这些方法扩展到其他类 - 例如类Asteroid,类Bullet或类Particle。

问题在于 - 界面的优势在于它允许您根据需要重新定义所使用的每个类的实现。但是,对于像链接列表这样的东西,代码不会在类之间发生变化。由于我计划有很多将实现这些对象池方法的类,所以我真的希望避免在每个新类中反复使用相同的实现代码。

问题:有没有办法避免为我使用的每个类重复使用相同的链接列表代码?或者这只是必然性?这似乎违反了Once and Only Once原则。是否可以在继承块中定义一个完整的函数,而不仅仅是它的原型?

如果这是一个愚蠢的问题,请告诉我。 (如果我问它是否是,它可能是,但是嘿,偶尔也不能学会愚蠢。)似乎应该有一种更合乎逻辑的方式来做这样的事情。

2 个答案:

答案 0 :(得分:2)

在支持多重继承的其他语言中,有一种简单的方法可以在没有所有游戏对象需要共同祖先的情况下执行此操作:您的太空飞船可以从基础船类继承,以及链接列表元素类。不幸的是,AS3不支持多重继承,因此您必须选择:

一个。完全按照您的建议使用界面

B中。让所有游戏对象基类继承自实现链表功能的公共祖先,并扩展Sprite(或MovieClip),而不是直接扩展Sprite或MovieClip的游戏对象基类。

我可能会选择后者,以解决您的确切问题。我可能从Sprite或MovieClip派生并调用GamePoolObject之类的东西......或者

答案 1 :(得分:0)

我从不喜欢使用界面 我要做的是建立另一个基类 第一个类将是基类,我们称之为SpaceObject。所有空间物体都具有质量,速度,摩擦力(如果有),旋转等属性。 SpaceObject也会扩展UI组件,因为我们希望最终将它添加到显示列表中并且使用继承的命中检测方法会很好。
它还将具有处理移动的方法以及空间物体所需的任何其他方法 然后,只要我想创建一个新的空间对象,我就会扩展SpaceObject类 公共类SpaceShip扩展了SpaceObject或
公共类Commet扩展了SpaceObject 这些类将继承SpaceObjects属性,并拥有自己的尾巴有多长或它有多少武器。它们应该被封装以处理与它们相关的任何内容