2015-06-03 7 views
4

Я пытаюсь создать экземпляр класса на основе параметра типа функции.
Хотя documentation говорит, что это возможно, я не могу заставить его работать.Построение параметра типового типа в Haxe

Рассмотрим следующий код:

// Dialog base class 
// Every dialog in my application will derive from this 
class Dialog 
{ 
    public function new() 
    { 
     // do some stuff here 
    } 
} 

// One of the possible dialogs in the application 
// Extends Dialog 
class TestDialog extends Dialog 
{ 
    public function new() 
    { 
     super(); 
     // do some more stuff 
    } 
} 

// A simple class that tries to instantiate a specialized dialog, like TestDialog 
class SomeAppClass 
{ 
    public function new() 
    { 
     var instance = create(TestDialog); 
    } 

    @:generic 
    function create<T:Dialog>(type:Class<T>):T 
    { 
     return new T(); 
    } 
} 

Это не работает со следующей ошибкой:
create.T does not have a constructor

Очевидно, что я делаю что-то не так, но что?

ответ

3

SpecialDialog может иметь другой конструктор чем Dialog. Итак, вы должны ограничить его, а затем также ограничить Dialog.

Code @ Try Haxe

package; 


typedef Constructible = { 
    public function new():Void; 
} 


// Dialog base class 
// Every dialog in my application will derive from this 
class Dialog 
{ 
    public function new() 
    { 
     trace("dialog"); 
    } 
} 


class SuperDialog extends Dialog 
{ 
    public function new() 
    { 
     super(); 
     trace("super dialog"); 
    } 
} 

// A simple class that tries to instantiate a specialized dialog, like TestDialog 

class SomeAppClass 
{ 
    public function new() 
    { 
     var dialog = create(Dialog); 
     var superDialog = create(SuperDialog); 
    } 

    @:generic 
    public static function create<T:(Constructible,Dialog)>(type:Class<T>):T 
    { 
     return new T(); 
    } 
} 

class Test { 
    static public function main() { 
    new SomeAppClass(); 
    } 
} 
+0

ли это означает, что я должен иметь ЬурейеЕ как ограничение? – NemoStein

+0

typedef сообщает компилятору структуру для конструктора, которую вы будете использовать. –

+2

Я не могу понять, зачем мне этот typedef вообще ... Класс (IMHO) должен быть достаточным, чтобы сообщить компилятору, что к чему. В любом случае, спасибо. – NemoStein