Domanda

Considera la seguente situazione:

Object > MyClass > MyClassA, MyClassB
.

Se voglio qualcosa nel livello dell'oggetto, ad esempio, ho aggiunto PrintDetail ();Come posso farlo nell'attuazione Java?Inoltre, posso sovrascrivere tutto il metodo del oggetto.Ad esempio, ho bisogno di avere un nuovo nuovo .tostring (), posso sovrascriverlo?Grazie.

È stato utile?

Soluzione

No, non può, non proprio comunque.Objective C è un linguaggio digitato e scambiato dinamicamente, che lo rende molto suscettibile di funzioni come categorie.Il più vicino possibile a questo in Java è la strumentazione di classe tramite una biblioteca di manipolazione del codice byte come asm o javassist .

Ma in realtà, quando si utilizza un linguaggio OO fortemente digitato come Java, dovresti abbracciare le sue caratteristiche piuttosto che cercare di duplicare quelle di un'altra lingua.

Altri suggerimenti

Come accennato nelle altre risposte, non c'è nulla di veramente come una categoria. Ho alcune soluzioni comuni che uso per alcune categorie nel mio codice obiettivo-C quando si passa a Java. Molte delle mie categorie di obiettivi-c esistono perché non voglio estendere le classi di base iOS ma voglio aggiungere qualche funzionalità a quella classe. Molte di quelle categorie Obiettivo-C non aggiungono proprietà utilizzando Objc_setAssocicatedObject. Per quei casi uso una classe di aiutante statica in Java. Diamo un'occhiata ad un esempio usando NSString e String. Aggiungerò funzionalità a entrambe aggiungere quotazioni alla stringa. Supponiamo che questo sia utile e non esiste per gli scopi dell'illustrazione. Nell'obiettivo-c potremmo avere:

@interface NSString (MyCategory)

/**
 * Creates and autoreleased image from self.
 */
- (NSString*)quotedString;

@end

@implementation NSString (MyCategory)

- (NSString *)quotedString
{
    return [NSString stringWithFormat:@"\"%@\"", self];
}

@end
.

Lo chiameresti da qualche parte come questo:

NSString *myString = @"When you're curious, you find lots of interesting things to do.";
NSString *quotedString = [myString quotedString];
.

Ecco come avrei implementato questo in Java:

public class StringHelper {

    public static String quotedString(String that) {
        return '"' + that + '"';
    }
}
.

e chiamarlo:

String myString = = "When you're curious, you find lots of interesting things to do.";
String quotedString = StringHelper.quotedString(myString);
.

Se si ritiene ai metodi della categoria come metodi che invia automaticamente l'auto variabile come il primo argomento del metodo (anche se invisibile), quindi rende ancora più senso.

Per il tuo esempio, se non avrei prolungare l'oggetto specifico, potrei fare qualcosa come:

public class ObjectHelper {

    public static void printDetail(Object that) {
        // do what it takes;
    }
}
.

Aggiornamento: un commentatore ha chiesto limitazioni.

Limitazioni sarebbe che il codice è in una classe statica separata. Non è così conveniente come una categoria. Devi ricordare quei nomi di classe o trovarli e non riceverai il completamento automatico sui tuoi metodi di oggetti originali nell'assistente. Inoltre, non è possibile utilizzare proprietà o attributi del livello dell'oggetto come si ottiene con objc_setocietatoObject. Puoi usare una mappa hash e creare qualcosa di simile con l'istanza dell'oggetto originale come chiave di hash.

public class StringHelper {
    private static Map<String, Integer> order = new HashMap();

    public static int getOrder(String that) {
        if(that == null) { return 0; }
        Integer ret = StringHelper.order.get(that);
        if(ret == null) { return 0; }
        else { return ret; }
    }
    public static void setOrder(String that, int order) {
        if(that != null) {
            StringHelper.order.put(that,  order);
        }
    }
}
.

Non ci sono anche scontri nomi con la classe originale, che sarebbe più di un vantaggio. I nomi degli scontri nelle categorie di obiettivi-C sono considerati cattivi.

Tutte le classi Java eventualmente hanno generatoDicetagCode a causa di questo, tutti i metodi java.lang.Object da Java classes inherit.La metà di questi metodi è Object e non può essere final.Tuttavia, Gli altri metodi in oggetto possono essere e sono sovrascritti

Il metodo Tostring () nella classe dell'oggetto viene utilizzato per visualizzare alcune informazioni relative a qualsiasi oggetto.
Quindi puoi sovrascriverlo secondo te stesso ...
Ex ..

public class Test{  
  @Override
  public String toString() {  
  /// staff  
  }  
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top