3 votes

Mark Haxe Classe pour l'extension forcée ?

Existe-t-il une méta-compilation pour la déclaration de classe, qui empêche la création d'une instance de classe avant de l'étendre ? En d'autres termes - une sorte d'opposé de @:final méta.

Comme ceci (dernière ligne de code) :

class A {
    // ...
}

class B extends A {
    // ...
}

// ...
var b = new B(); // OK
var a = new A(); // induce compiler-error

6voto

KevinResoL Points 576

Il suffit de ne pas déclarer de constructeur pour la classe A.

2voto

Jeff Ward Points 2849

Les deux autres réponses sont correctes (pas de constructeur ou constructeur privé), mais il y a quelques détails supplémentaires qui peuvent vous intéresser :

  • Voici un exemple d'aucun constructeur. Il est à noter que A n'a tout simplement pas de constructeur, et B n'appelle simplement pas super() . À part cela, tout le reste fonctionne comme prévu.
  • Voici un exemple d'un constructeur privé. Vous ne pouvez toujours pas instancier un new A() mais vous devez quand même appeler super() de B Le constructeur de l'entreprise.

Technicité :

  • L'utilisation de certaines fonctionnalités (comme une valeur par défaut sur une variable membre) provoquera A pour obtenir un constructeur implicite, automatiquement. Ne vous inquiétez pas, cela n'affecte pas la constructibilité ou le fait que vous devez ou non appeler super() . Mais sachez qu'il est là, et si nécessaire, un implicite. super() est ajouté à l'appel B Le constructeur de l'entreprise. Voyez la sortie JS pour le vérifier.
  • Dans tous les cas, sachez que vous pouvez toujours instancier une A au moment de l'exécution avec var a = Type.createInstance(A,[]); car les contrôles de type à la compilation ne limitent pas RTTI .

Discussion connexe :

En dehors de private/no constructor, Haxe n'a pas de notion formelle de classes abstraites 1 (classes de base qui ne sont pas censées être instanciées) ou méthodes abstraites 2 (fonctions sur des classes de base abstraites sans implémentation qui doit être implémentée par une classe dérivée). Cependant, Andy Li a écrit une macro pour faire respecter certains de ces concepts si vous les utilisez. Une telle macro peut détecter les violations de ces règles et générer des erreurs de compilation.


1. À ne pas confondre avec <a href="https://haxe.org/manual/types-abstract.html" rel="nofollow noreferrer">Haxe abstrait les types </a>qui sont un sujet entièrement différent.

2. A ne pas confondre avec <strong>fonctions virtuelles </strong>qui, selon wikipedia <a href="https://en.wikipedia.org/wiki/Virtual_function" rel="nofollow noreferrer">décrit </a>comme une fonction qui <em>puede </em>(bien que les différentes docs pour les différentes langues décrivent ce terme très chargé différemment).

1voto

madneon Points 11

Une façon d'y parvenir est de créer un constructeur de classe privé :

class A {
    private function new() {
        // ...
    }
}

// ...
var a = new A(); // Error: Cannot access private constructor

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X