2010-07-29 13 views
0

Je suis en train d'utiliser étend (héritage) en Java. J'ai fait une classe abstraite rapide à partir de, et ensuite étendu. Cependant, mon IDE dit maintenant qu '"une instance englobante qui contient abstract_class est requise" et donne à mon constructeur les grandes lignes d'erreur des classes dérivées. De quoi est-ce que ça se passe? La classe abstraite n'a pas ou n'a besoin d'aucun type de constructeur. Juste pour référence, j'utilise des extensions plutôt que des implements en partie parce que les détails d'implémentation que je ne veux pas avoir à maintenir pour chaque classe dérivée qui sont identiques impliquent l'utilisation de la réflexion sur ceci.L'utilisation extends en Java enfermant erreur donne par exemple

Modifier: J'ai lu certaines des réponses. Au nom de Dieu, qu'est-ce qu'une classe statique (ou non statique, d'ailleurs)? Et juste pour vous irriter, cela n'a pas résolu le problème.

// some_class.java 
public class some_class { 
    public static abstract class abstract_class { 
     ... 
    } 
    ... 
} 

// Model.java 
public class Model extends some_class.abstract_class { 
    public Model(...) { 
     // No enclosing instance! Critical error. 
     ... 
    } 
    ... 
} 

Et je pensais que les fichiers d'en-tête de C++ étaient mauvais.

+1

Pouvons-nous voir code s'il vous plaît? – PaulJWilliams

+0

Ne pas avoir de cours dans d'autres classes! (encore :)) –

Répondre

2

Le code que vous avez posté semble très bien compiler pour moi. Essayez de faire une construction propre dans votre IDE et cela devrait fonctionner. Juste pour votre propre curiosité, Java a 2 types de classes internes: static et régulier ou (non-static). Si vous ne pas inclure le mot-clé static pour une définition de classe interne, cela signifie qu'une instance de cette classe exige toujours une instance de la classe parente. Ex:

public class MyClassOuter { 
    //... 
    public class MyClassInner { 
     //.. 
    } 
} 

Si vous écrivez que, il est entendu que toute instance de MyClassInner aura une référence implicite à une instance de MyClassOuter.

Static, d'autre part, la main implique pas une telle chose. C'est juste une définition de classe qui se trouve dans une autre définition de classe. La classe externe est utilisée presque comme un paquet (mais pas tout à fait).

0

Le message "instance englobante" implique presque certainement que vous avez une classe interne (non statique) pour votre superclasse. Dans la plupart des cas, les classes internes peuvent et doivent être statiques - c'est probablement la meilleure solution ici. Sinon, comme le message dit, vous aurez besoin d'utiliser une instance englobante de la classe « externe », si votre parent fait vraiment sens comme une classe interne non statique. L'affichage d'un code aidera à dissocier l'ambiguïté de ces causes et suggérera la meilleure façon de le résoudre.

Je vais aussi être en mesure de donner des exemples des résolutions avec les noms de classe à droite - actuellement, je ne pense pas que des noms arbitraires qui vous aideront autant qu'il semble que vous ne l'aviez pas identifié la question de la classe interne/externe.

0

Vous devez dans votre classe enfant ajouter dans le constructeur super() cette super classe peut être créée.

2

si vous avez

interface MyInterface 
{ 

    abstract class MyAbstractClass { 
    // ... 
    } 
} 

puis vous essayez

class ConcreteClass extends MyAbstractClass { 

} 

Vous obtiendrez l'erreur décrite. La solution est soit de déplacer MyAbstractClass à une classe de niveau supérieur (le mettre dans son propre fichier - pas strictement nécessaire pour les classes non publiques, mais conserve le code organisé.) Vous pouvez également ajouter le modificateur static à la déclaration MyAbstractClass.

0

class A {

. 
. 
. 


class B{ 
     . . .  
} 

}

si vous souhaitez accéder à la classe B et il n'est pas classe interne statique vous pouvez écrire le code comme

AB objOfB = new A(). nouveau B();