Dies ist wegen der Polymorphie unmöglich. Folgendes berücksichtigen. Sie haben die Methode in der Klasse A
mit einem Zugriffsmodifikator, der nicht private
ist. Warum nicht privat? Denn wenn es privat war, dann konnte keine andere Klasse von ihrer Existenz wissen. Also muss es etwas anderes sein, und etwas anderes muss von irgendwo zugänglich sein.
Angenommen, Sie übergeben eine Instanz der Klasse C
an irgendwo. Aber Sie upCast es A
vorher, und so am Ende Sie diesen Code mit irgendwo:
void somewhereMethod(A instance) {
instance.method(); // Ouch! Calling a private method on class C.
}
Ein schönes Beispiel, wie diese gebrochen wurde QSaveFile in Qt ist. Anders als Java erlaubt C++ tatsächlich, Zugriffsrechte zu reduzieren. Also taten sie genau das und verbieten die close()
Methode. Was sie damit endete ist eine QIODevice
Unterklasse, die nicht wirklich eine QIODevice
mehr ist. Wenn Sie einen Zeiger auf QSaveFile
an eine Methode übergeben, die QIODevice*
akzeptiert, können sie weiterhin close()
aufrufen, da es in QIODevice
öffentlich ist. Sie "fixierten" dies, indem sie QSaveFile::close()
(was privat ist) anrufen abort()
, wenn Sie so etwas tun, stürzt Ihr Programm sofort ab. Keine sehr schöne "Lösung", aber es gibt keine bessere. Und es ist nur ein Beispiel für schlechtes OO-Design. Deshalb lässt Java das nicht zu.
bearbeiten
Nicht, dass ich verpasst, dass Ihre Klasse abstrakt ist, aber ich vermisste auch die Tatsache, dass B extends C
, nicht A
. Auf diese Weise ist das, was Sie tun möchten, völlig unmöglich. Wenn die Methode in B public
ist, wird sie auch in allen Unterklassen öffentlich sein. Das einzige, was Sie tun können, ist zu dokumentieren, dass es nicht und genannt werden sollte, um es vielleicht zu überschreiben, um UnsupportedOperationException
zu werfen. Aber das würde zu den gleichen Problemen führen wie bei QSaveFile
.Denken Sie daran, dass Benutzer Ihrer Klasse möglicherweise nicht einmal wissen, dass es sich um eine Instanz von C
handelt, damit sie nicht einmal die Möglichkeit haben, ihre Dokumentation zu lesen.
Insgesamt ist es nur eine sehr schlechte Idee OO-weise. Vielleicht sollten Sie eine andere Frage zu dem genauen Problem stellen, das Sie mit dieser Hierarchie lösen wollen, und vielleicht erhalten Sie einige anständige Ratschläge, wie Sie es richtig machen können.
Sie können das überschriebene Finale aber nicht privat machen. Sie können es auch veraltet machen und eine nicht unterstützte Operation Exception werfen (Guava tut das für unveränderbare Sammlungen) –