Actionscript 3可共享功能(接口?)

时间:2010-10-06 22:26:56

标签: actionscript-3 oop

我最近一直在研究OOP方法,这是我一直想知道的事情。

假设我们有以下情况。我们有一系列宠物[狗,猫,老鼠]。 每只宠物都有相同的行为:跑步,吃饭,睡觉。此外,它们都有不同的视觉表现。

而不是制作3个单独的类并重新创建这样的3个函数:

  • 吃功能
  • 运行功能
  • 睡眠功能

[猫和老鼠一样]

有没有更好的方法来简单地“共享”这些不同类之间的函数集合,并且以某种方式区分这些函数的行为取决于所选择的类(狗的步行速度可能比猫快,a猫可能比小鼠睡得更多等)。

我已经查看了接口,但据我所知,您实际上无法对函数进行编码,接口只是一个类应该具有的需求列表。可能是非常错误的。非常感谢帮助:)

3 个答案:

答案 0 :(得分:1)

听起来你只需要继承吗?

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中发现非常有用的接口 - 每次我尝试使用它们时,我最终都会将它们重构为类,而当我意识到我想在实现之间共享功能时。

答案 1 :(得分:1)

我认为接口为使用多态性提供了更多好处。说动物界面

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
       }
   }

}

但从某种意义上讲,这就是界面有时更好的原因

答案 2 :(得分:0)

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++;
    }

}

}

你的任何其他动物都只是实现了Mammal类及其所有方法。如果你保持足够的抽象,他们应该在更多的动物身上工作。这允许你操纵各种各样的动物,知道它们都有一组期望相同参数的常用方法,而不通过子类化创建继承噩梦。

希望这会有所帮助。 -philip