вопрос гибкого интерфейса - PullRequest
2 голосов
/ 19 июня 2009
<?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>

В приведенном выше коде IBrowserManager является интерфейсом, а BrowserManager.getInstance () возвращает объект типа IBrowserManager. Но из того, что я знаю об интерфейсах, нельзя создать экземпляр интерфейса? Итак, как же я могу создать экземпляр интерфейса здесь?

Ответы [ 2 ]

5 голосов
/ 19 июня 2009

Допустим, у вас был интерфейс IPerson, который определил двух членов - имя и пол:

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

    function get gender:String;
    function set gender(value:String):void;
}

... и у вас было два конкретных класса, Woman и Man, оба из которых реализовали интерфейс 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;
    }
}

и

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

Вы могли бы в конечном итоге сделать что-то вроде этого:

var crowdOfPeople:ArrayCollection = YourCrowdOfPeopleClass.getInstance();

for each (var p:IPerson in crowdOfPeople)
{
    trace(p.name);
    trace(p.gender);
}

... то есть действовать (в этом случае отслеживать свойства) конкретных реализаций Мужчины и Женщины, как если бы они были объектом одного и того же типа, поскольку они оба соответствуют интерфейсу IPerson (т.е. , оба определяют имя и гендерные свойства).

Это объектно-ориентированный принцип полиморфизма в действии - иногда вы услышите его как принцип «Программируйте интерфейсы, а не реализации». Надеюсь, это поможет!

3 голосов
/ 19 июня 2009

Вы не создаете экземпляр интерфейса. Здесь вы получите экземпляр класса, который реализует этот интерфейс. Вполне естественно, что вы можете назначить переменную типа IBrowserManager, экземпляр класса BrowserManager, который реализует IBrowserManager.

...