我正在尝试定义一个接口,其中一个方法(initPage)需要在每个实现中具有不同的参数。我怎样才能做到这一点?使用... args对我来说并不好,因为我正在失去强大的类型检查。
public interface IPage {
function initPage(...args):void;
function showPage():void;
function hidePage():void;
function removePage():void;
}
答案 0 :(得分:2)
您知道可以实现多个接口吗?
我认为你应该维护你的实际接口,减去“有问题”的方法,并创建另一个接口,每个接口都有不同的方法
public interface IPage
{
function showPage():void;
function hidePage():void;
function removePage():void;
}
public interface IPrettyPage
{
function initPage(p:PrettyArg);
}
public interface IUglyPage
{
function initPage(u:UglyArg);
}
// your implementation Class
package
{
public class Page extends Sprite implements IPage, IPrettyPage
{
// Implementation
}
}
无论如何,这是另一个好主意的例子,但是是一个Java代码: http://www.java2s.com/Code/Java/Language-Basics/Implementmultipleinterfaces.htm
我没有测试,但我几乎可以肯定这个问题在AS3中有所不同。
答案 1 :(得分:1)
您不能拥有定义每个实现使用不同参数的方法的接口。
接口的目的是为实现该接口的所有类定义一组通用的方法签名。
让每个类采用不同的参数都会失败,所以如果不使用rest参数(...)就不能这样做。
答案 2 :(得分:1)
对于接口的不同实现具有不同的参数违背了接口的基本目的。如果你只有对接口的引用,你怎么知道要传递什么参数?
答案 3 :(得分:0)
对我来说使用... args并不好,因为我正在失去强大的类型检查。
所以你知道一定数量的论点,甚至是他们的类型,所以我能想象的唯一不便是你经常要调用这个没有args的函数。我通常会这样解决:private function doSomething(e: Event = null):void {}
如果你不确定这个函数还有另一种方法 - 只要将一个对象作为参数传递,并在你确定所有数据字段后立即将其更改为某个自定义关联数组类
答案 4 :(得分:0)
您可以使用类构造函数传递您需要的任何参数,并将参数保留在initPage方法之外。
public interface IPage
{
function initPage():void;
function showPage():void;
function hidePage():void;
function removePage():void;
}
//any class that implements IPage can have a different
//set of arguments
public class A implements IPage
{
//for example...
private var obj1:String;
private var obj2:int;
public function A( obj1:String , obj2:int )
{
this.obj1 = obj1;
this.obj2 = obj2;
}
public function initPage():void
{
//obj1 & ob2 are available here
}
}
答案 5 :(得分:0)
如果initPage
接受的不同对象作为参数共享某个结构,则它们都可以扩展另一个接口或父类。例如:
function initPage(arg:DisplayObject):void;//For example
initPage
可以收到Bitmap
,Sprite
或MovieClip
个对象,保留至少一些严格的输入。该方法的每个实现中的代码至少可以确保此类实现正在接收预期的对象类型。