flex接口问题

dha*_*0us 2 apache-flex actionscript interface instance

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Label id="lb" text="check"/>
    <mx:Script>
        <![CDATA[
            import mx.managers.BrowserManager;
            import mx.managers.IBrowserManager;
            public var brm:IBrowserManager = BrowserManager.getInstance();
        ]]>
    </mx:Script>
</mx:WindowedApplication>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,IBrowserManager是一个接口,BrowserManager.getInstance()返回一个IBrowserManager类型的对象.但是,根据我所知的接口,无法创建接口的实例?那么,为什么我可以在这里创建一个接口实例?

Chr*_*ato 5

假设您有一个界面IPerson,它定义了两个成员 - 名称和性别:

public interface IPerson
{
    function get name():String;
    function set name(value:String):void;

    function get gender:String;
    function set gender(value:String):void;
}
Run Code Online (Sandbox Code Playgroud)

......你有两个具体的课程,女人和男人,两者都实现了IPerson界面.

public class Man implements IPerson
{
    private var _name:String;
    private var _gender:String;

    public function Man(name:String, gender:String)
    {
        this.name = name;
        this.gender = gender;   
    }

    public function get name():String
    {
        return _name;
    }

    public function set name(value:String):void
    {
        _name = value;
    }

    public function get gender()
    {
        return _gender;
    }

    public function set gender(value:String):void
    {
        _gender = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

public class Woman implements IPerson
{
    private var _name:String;
    private var _gender:String;

    public function Woman(name:String, gender:String)
    {
        this.name = name;
        this.gender = gender;   
    }

    public function get name():String
    {
        return _name;
    }

    public function set name(value:String):void
    {
        _name = value;
    }

    public function get gender()
    {
        return _gender;
    }

    public function set gender(value:String):void
    {
        _gender = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以最终做这样的事情:

var crowdOfPeople:ArrayCollection = YourCrowdOfPeopleClass.getInstance();

for each (var p:IPerson in crowdOfPeople)
{
    trace(p.name);
    trace(p.gender);
}
Run Code Online (Sandbox Code Playgroud)

...也就是说,作为(在这种情况下,追踪属性)的男人和女人的具体实现,就像它们是同一种对象一样,因为它们都符合IPerson界面(即两者都是定义名称和性别属性).

这是面向对象的多态性原理 - 有时你会听到它作为一个原则,"程序接口,而不是实现." 希望有所帮助!