How to avoid reusing identical implementation code with an interface?
首先,我为"又一个界面问题"道歉。不过,我觉得这个问题可能值得一问,因为这是一个奇怪的问题。我正在使用的项目使用ActionScript3,但这更像是一个普通的OOP问题。
情况如下:
我有一个类已经从基类继承;它是一个视频游戏中的对象。(假设它是一艘宇宙飞船。)在我的游戏中,我想一次在屏幕上有许多宇宙飞船,所以我决定使用链接列表结构创建一个对象池。
从逻辑上讲,因为类spaceship已经从基类继承,所以我将使用接口来定义与链接列表相关的方法。此外,这样做可以让我将这些方法扩展到其他类——例如类小行星、类子弹或类粒子。
这就是问题所在——接口的优点在于,它允许您根据需要为所使用的每个类重新定义实现。但是,对于像链表这样的东西,代码不会在类之间发生变化。因为我计划有很多类来实现这些对象池方法,所以我真的希望避免在每个新类中反复重用相同的实现代码。
问题:有没有一种方法可以避免为我使用的每个类重用相同的完全链接的列表代码?或者这只是不可避免的?这似乎违反了一次又一次的原则。是否可以在继承块中定义一个完整的函数,而不仅仅是它的原型?
如果这是个愚蠢的问题,请告诉我。(如果我问是不是,很可能是,但是,嘿,偶尔不犯傻是学不到的。)看起来应该有一个更合理的方法来做这样的事情。
在其他支持多重继承的语言中,有一种简单的方法可以做到这一点,而不需要所有的游戏对象都有一个共同的祖先:你的宇宙飞船可以从一个基本飞船类继承,也可以从一个链表元素类继承。不幸的是,AS3不支持多重继承,因此您必须选择:
a.按照您的建议使用接口
或
b.让你所有的游戏对象基类继承自一个实现链表功能并扩展sprite(或movieclip)的公共祖先,而不是你的游戏对象基类直接扩展sprite或movieclip。
我可能会选择后者来解决你的确切问题。我可能会从sprite或movieclip中派生出来,并称之为gamepoolbject或类似的东西…
我从不喜欢使用界面。
我要做的是创建另一个基类
第一个类是基类,我们称之为spaceobject。所有空间物体都有质量、速度、摩擦力(如果有的话)、旋转等属性。spaceobject还将扩展uicomponent,因为我们希望最终将其添加到显示列表中,并且继承命中检测的方法会很好。
它还将具有处理移动和空间对象所需的任何其他方法。
然后,每当我想创建一个新的空间对象时,我只需扩展space object类。
公共类宇宙飞船扩展太空物体或公共类commet扩展spaceobject。
这些类将继承空间对象属性,并拥有它们自己的属性,比如尾巴有多长或拥有什么武器。它们应该被封装以处理与它们相关的任何内容。