最近我一直在研究OOP方法,下面是我一直在想的事情。
假设我们有以下情况。我们收集了宠物狗,猫,老鼠。每只宠物都有相同的行为:跑步、进食、睡觉。而且,它们都有不同的视觉表现形式。
而不是创建3个单独的类并重新创建这3个函数,如下所示:
猫和老鼠也是如此。
是否有更好的方法简单地在这些不同的类之间“共享”一组函数,并在某种程度上区别这些函数依赖于所选类的行为(狗的行走速度可能比猫快,猫的睡眠可能比老鼠多等等)。
我看过接口,但据我所知,您实际上无法编写函数,接口只是一个类应该具有的需求列表。可能是大错特错。(非常感谢:)
发布于 2010-10-06 22:40:37
听起来你只是需要遗产?
class Animal {
public function eat():void { stuff }
public function run():void { stuff }
public function sleep():void { stuff }
}
class Dog extends Animal {
}
...
我的游戏里到处都是这样的东西。
要根据子类的不同而有所不同:
如果这是一个很大的更改,那么显然您应该重写子类中的方法。
class Dog {
public function wagTail():void { stuff }
override public function run():void {
super.run();
wagTail();
}
}
如果这是一个很小的更改,您可以选择将行为交给父类,并使用成员变量稍微修改它:
class Animal {
protected var walkSpeed:Number;
public function walk():void {
x += walkSpeed;
}
}
class Dog {
public function Dog() {
walkSpeed = 6;
}
}
就我个人而言,我从未发现接口在AS3中非常有用--每次我尝试使用它们时,当我意识到我希望在实现之间共享功能时,我最终会将它们重构为类。
发布于 2011-02-21 22:14:38
我认为接口为使用多态性提供了更多的好处。如动物接口
public interface Animal{
function eat();
}
public class DogA implements Dog implements Animal{
public eat(){ ... }
}
public class CatA implements Cat implements Animal{
public eat(){ ... }
}
public class Main{
public function getAnimal(a1:Animal){ // so you can pass in different animals
if(a1 is Dog){
... do this
}else if(a1 is Cat){
... do this
}
}
}
但从这个意义上讲,这就是为什么界面有时更好的原因
发布于 2010-10-06 22:43:46
As3支持接口,尝试为哺乳动物创建接口
package com.you.interfaces
{
public interface Mammal
{
//--------------------------------------
// PUBLIC METHODS
//--------------------------------------
function eat():void;
function move(speed:uint = 0):void;
function sleep():void;
//--------------------------------------
// GETTER/SETTERS
//--------------------------------------
function get health():uint;
function set health(value:uint):void;
}
}
在哺乳动物项目中:
package com.you.animals
{
import com.philipbroadway.interfaces.Mammal;
import flash.display.Sprite;
public class Dog extends Sprite implements Mammal
{
//--------------------------------------
// CONSTRUCTOR
//--------------------------------------
public function Dog()
{
super();
}
//--------------------------------------
// PRIVATE VARIABLES
//--------------------------------------
private var _hp:uint;
private var _moveSpeed:uint;
//--------------------------------------
// GETTER/SETTERS
//--------------------------------------
public function get health():uint
{
return 0;
}
public function set health(value:uint):void
{
_hp = value;
}
//--------------------------------------
// PUBLIC METHODS
//--------------------------------------
public function eat():void
{
health++;
}
public function move(speed:uint=0):void
{
_moveSpeed++;
}
public function sleep():void
{
health++;
}
}
}
任何其他动物都可以简单地实现哺乳动物类及其所有方法。如果你把它们保持得足够抽象,它们就应该在更多的动物中工作。这允许您操纵大量的动物,知道它们都有一组期望相同参数的公共方法,而不需要通过子类来创建继承噩梦。
希望这能有所帮助。-philip
https://stackoverflow.com/questions/3877381
复制相似问题