2016-08-03 49 views
3

Soweit ich in Dart verstanden habe, ist es möglich, abstrakte Klassen zu verwenden, um "Schnittstellen" oder "Protokolle" zu deklarieren (wenn Sie von objective-c kommen). Anyway Ich habe Probleme bei der Suche nach einer Möglichkeit, eine optionale Methode in der abstrakten Klasse/Schnittstelle zu deklarieren.Deklaration einer Methode als optional in der abstrakten Klasse

Wenn ich erklären, eine Methode in der abstrakten Klasse A, und lassen Sie die konkrete Klasse Bimplementieren A, erhalte ich eine Warnung im Compiler. Ich möchte in der Lage sein, eine Methode als optional zu deklarieren oder zumindest eine Standardimplementierung bereitzustellen, ohne sie in einer Klasse, die meine Schnittstelle implementiert, neu deklarieren zu müssen.

abstract class A{ 
    void abstractMethod(); 
} 

class B implements A{ 
//not implementing abstract method here gives a warning 
} 

Antwort

2

So funktionieren Schnittstellen nicht. Wenn Ihre Klasse angibt, eine Schnittstelle zu implementieren, dann muss sie dies tun.

können Sie teilen Sie die Schnittstelle

abstract class A { 
    void abstractMethod(); 
} 

abstract class A1 extends A { 
    void abstractMethod(); 
    void optionalMethod(); 
} 


class B implements A { 
//not implementing abstract method here gives a warning 
} 

nur dann, wenn es heißt A1 implementieren es optionalMethod umzusetzen hat.

Alternativ können Sie die abstrakte Klasse

abstract class A{ 
    void abstractMethod(); 
    void optionalMethod(){}; 
} 

class B extends A { 
//not implementing abstract method here gives a warning 
} 

dann nur abstractMethod Bedürfnisse erweitern, weil A außer Kraft gesetzt werden, keine Implementierung zur Verfügung stellen.

+0

ich Ihre Lösung verstehen und mit ihm "konzeptionell" zustimmen. Allerdings wurde meine Frage genau gestellt, um zu verstehen, ob es eine Möglichkeit gibt, dieses Verhalten in Dart zu erreichen. In objective-c kann ich eine Methode in einer "Schnittstelle" deklarieren (auch wenn sie als Protokoll bezeichnet wird) und sie als @optional kennzeichnen. Auf diese Weise würde sich der Analysator nicht über eine fehlende Implementierung beschweren. Hoffte auf ein solches Verhalten in Dart, aber anscheinend, nach Ihrer Antwort zu urteilen, ist nicht möglich. –

+0

Ich bin mir ziemlich sicher, dass es nicht ist –

1

Abstrakte Methoden, die in Klassen definiert sind, können nicht als optional gekennzeichnet werden. (Zumindest nicht in der regulären Dart-Sprache, ich kenne keine Annotationen, die so etwas unterstützen könnten.)

Jede Klasse, die eine Schnittstelle implementiert, muss eine Implementierung aller abstrakten Methoden bereitstellen, aber diese Methodenimplementierungen können trivialerweise einen Fehler ausgeben, um anzuzeigen, dass die Methode nicht verfügbar ist.

  • Wurf UnimplementedError wenn die implementierende Klasse unvollständig ist und die ordnungsgemäße Umsetzung ist später

  • Wurf UnsupportedError hinzugefügt werden, wenn die implementierende Klasse nicht beabsichtigt, das Verfahren zu implementieren.

Beachten Sie, dass UnimplementedErrorUnsupportedError implementiert.

Offensichtlich müssen Sie vernünftig sein, was Sie nicht implementieren möchten. Wenn es sich um Code handelt, der nicht freigegeben werden soll, können Sie nur Methoden implementieren, von denen Sie explizit wissen, dass sie benötigt werden. Wenn es in einem Bibliothekspaket ist, das mit anderen geteilt werden soll, benötigen Sie einen guten Grund, eine Methode nicht zu implementieren, und dieser Grund sollte gut dokumentiert sein.

Beispielcode:

abstract class A { 
    void abstractMethod(); 
} 

class B implements A { 

    void abstractMethod() { throw new UnimplementedError(...); } 

    // or 

    void abstractMethod() { throw new UnsupportedError(...); } 
} 

See:

https://api.dartlang.org/stable/1.18.1/dart-core/UnimplementedError-class.html https://api.dartlang.org/stable/1.18.1/dart-core/UnsupportedError-class.html