我最近一直在研究OOP方法,这是我一直想知道的事情。
假设我们有以下情况。我们有一系列宠物[狗,猫,老鼠]。 每只宠物都有相同的行为:跑步,吃饭,睡觉。此外,它们都有不同的视觉表现。
而不是制作3个单独的类并重新创建这样的3个函数:
[猫和老鼠一样]
有没有更好的方法来简单地“共享”这些不同类之间的函数集合,并且以某种方式区分这些函数的行为取决于所选择的类(狗的步行速度可能比猫快,a猫可能比小鼠睡得更多等)。
我已经查看了接口,但据我所知,您实际上无法对函数进行编码,接口只是一个类应该具有的需求列表。可能是非常错误的。非常感谢帮助:)
答案 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