Pregunta

Considere la siguiente situación:

Object > MyClass > MyClassA, MyClassB

Si quiero algo en el nivel de Objeto, por ejemplo, agregué printDetail();¿Cómo puedo hacerlo en la implementación de Java?Además, ¿puedo anular todos los métodos del objeto?Por ejemplo, necesito tener un .toString() completamente nuevo, ¿puedo anularlo?Gracias.

¿Fue útil?

Solución

No, no puede, en realidad no, de todos modos.El Objetivo C es un lenguaje de escopía y escritura dinámicamente escrita, lo que lo convierte en sus propias características como categorías.Lo más cercano que puede venir a esto en Java es la instrumentación de clase a través de una biblioteca de manipulación de código de bytes como asm o Javassist .

Pero, en realidad, cuando se usa un idioma OO muy escrito como Java, debe abarcar sus funciones en lugar de intentar duplicar los de otro idioma.

Otros consejos

Como se mencionó en las otras respuestas, no hay nada como una categoría. Tengo algunas soluciones comunes que uso para algunas de las categorías en mi código objetivo-C cuando se transfiere a Java. Existen muchas de mis categorías de objetivos, porque no quiero extender las clases base de iOS, pero quiero agregar alguna funcionalidad a esa clase. Muchas de esas categorías de objetivos, no agregan propiedades usando objc_setassociatedObject. Para aquellos casos que uso una clase de ayuda estática en Java. Veamos un ejemplo utilizando NSString y String. Agregaré funcionalidad a ambos para agregar cotizaciones a la cadena. Asumiremos que esto es útil y no existe a los efectos de la ilustración. En Objective-C podríamos tener:

@interface NSString (MyCategory)

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

@end

@implementation NSString (MyCategory)

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

@end

Llamaría a esto desde alguna parte como esta:

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

Así es como implementaría esto en Java:

public class StringHelper {

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

y para llamarlo:

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

Si piensa en los métodos de categoría como métodos que envían automáticamente la autoariable como el primer argumento del método (aunque invisible), esto hace aún más sentido.

Por su ejemplo, si no extendería el objeto específico, podría hacer algo así:

public class ObjectHelper {

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

Actualización: un comentarista solicitó limitaciones.

Las limitaciones serían que el código está en una clase estática separada. No es tan conveniente como una categoría. Tienes que recordar esos nombres de clases, o encontrarlos, y no obtendrá la finalización automática en sus métodos de objetos originales en el ayudante. Además, no puede usar propiedades de nivel de objeto o atributos como usted obtiene con objc_setsociatediatedObject. Puede usar un mapa de hash y crear algo similar con la instancia del objeto original como una tecla de 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);
        }
    }
}

Tampoco hay choques de nombre con la clase original, que sería más beneficioso. Nombre Los enfrentamientos en las categorías de objetivos, se consideran malos.

Todas las clases de Java eventualmente tienen java.lang.Object Debido a esto, todos Java classes inherit métodos de Object.La mitad de estos métodos son final y no puede ser overridden.Sin embargo, los otros métodos en Object pueden ser y son anulados
El método toString() en la clase Object se utiliza para mostrar información sobre cualquier objeto.
Para que pueda anularlo según usted mismo...
EX..

public class Test{  
  @Override
  public String toString() {  
  /// staff  
  }  
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top