Frage

Betrachten Sie folgende Situation:

Object > MyClass > MyClassA, MyClassB

Wenn ich beispielsweise etwas auf der Objektebene haben möchte, habe ich printDetail();Wie kann ich das in der Java-Implementierung machen?Kann ich außerdem alle Methoden des Objekts überschreiben?Ich benötige beispielsweise eine ganz neue .toString()-Datei. Kann ich diese überschreiben?Danke.

War es hilfreich?

Lösung

Nein, es kann sowieso nicht wirklich.Objective C ist eine dynamisch eingegebene und abgebaute Sprache, die es sehr angenehm ist, wie Kategorien zugänglich zu sein.Das nächste, was Sie in Java erreichen können, ist die Klasseninstrumentierung über eine Byte-Code-Manipulationsbibliothek wie asm oder javAssist .

Aber wirklich, wenn Sie eine stark eingegebene OO-Sprache wie Java verwenden, sollten Sie seine Merkmale annehmen, anstatt zu versuchen, diejenigen einer anderen Sprache zu duplizieren.

Andere Tipps

Wie in den anderen Antworten erwähnt, gibt es nichts wirklich wie eine Kategorie. Ich habe einige allgemeine Lösungen, die ich für einige der Kategorien in meinem objektiven C-Code benutze, wenn er nach Java portiert. Viele meiner Ziel-C-Kategorien bestehen, weil ich den iOS-Basisklassen nicht erweitern möchte, aber ich möchte dieser Klasse einige Funktionen hinzufügen. Viele dieser objektiven-c-Kategorien fügen nicht Eigenschaften mit objc_setociatedObject hinzu. Für diese Fälle verwende ich eine statische Helferklasse in Java. Schauen wir uns ein Beispiel mit NSString und Saite an. Ich füge Funktionalität, um beide Zitate für die Zeichenfolge hinzuzufügen. Wir gehen davon aus, dass dies nützlich ist und nicht für die Zwecke der Illustration existiert. In objektiv-c haben wir möglicherweise:

generasacodicetagpre.

Sie würden dies irgendwo anrufen:

generasacodicetagpre.

Hier würde ich das in Java implementieren:

generasacodicetagpre.

und um es anzurufen:

generasacodicetagpre.

Wenn Sie an die Kategorienmethoden als Methoden denken, die die Selbstvariable automatisch als das erste Methodenargument (obwohl unsichtbar) senden, ist dies noch sinnvoller.

Für Ihr Beispiel, wenn ich das bestimmte Objekt nicht verlängern würde, könnte ich etwas tun:

generasacodicetagpre.

Update: Ein Kommentator, der nach Einschränkungen gestellt wurde.

Beschränkungen wären, dass sich der Code in einer separaten statischen Klasse befindet. Es ist nicht so praktisch wie eine Kategorie. Sie müssen sich an diese Klassennamen erinnern oder sie finden, und Sie erhalten nicht den automatischen Abschluss Ihrer ursprünglichen Objektmethoden im Helfer. Sie können auch Eigenschaften von Objektebenen oder Attributen wie Sie mit objc_setassociedObject verwenden. Sie können eine Hash-Karte verwenden und mit der ursprünglichen Objektinstanz als Hash-Taste etwas Ähnliches erstellen.

generasacodicetagpre.

Es gibt auch keinen Namen mit der ursprünglichen Klasse, was eher einen Nutzen wäre. Namensclashes in objektiv-c Kategorien werden als schlecht angesehen.

Alle Java-Klassen haben schließlich java.lang.Object Aus diesem Grund alle Java classes inherit Methoden aus Object.Die Hälfte dieser Methoden ist final und kann nicht sein overridden.Jedoch, Die anderen Methoden in Object können und werden überschrieben
Die toString()-Methode in der Object-Klasse wird verwendet, um einige Informationen zu einem beliebigen Objekt anzuzeigen.
So können Sie es nach Ihren Wünschen überschreiben ...
EX..

public class Test{  
  @Override
  public String toString() {  
  /// staff  
  }  
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top