Clases de herencia

Tengo dos clases:

class ItemInfo { public View createItemView() { View v; // ... v.setTag(this); return v; } } class FolderInfo extends ItemInfo { @Override public View createItemView() { View v; // ... v.setTag(this); return v; } } 

Entonces lo uso:

 FolderInfo folderInfo; // Create it here ItemInfo itemInfo = folderInfo; View v = itemInfo.createItemView(); Object objectTag = v.getTag(); 

Entonces compruebo el tipo de objectTag por instanceof, y es ItemInfo! ¿Por qué?

Si haces esto:

 if (itemInfo instanceof ItemInfo) { System.out.println("OK!"); } 

Usted por supuesto ver "OK!" ya que FolderInfo es una subclase de ItemInfo – por lo que un FolderInfo es también un objeto ItemInfo .

La herencia significa que hay una relación "es una" de la subclase a la superclase – vea el principio de sustitución de Liskov .

Puede comprobar escribiendo:

 if (iteminfo instanceof FolderInfo) { // do what you want } else if (iteminfo instanceof ItemInfo) { // do what you want } 

InstanceOf es una comprobación de la relación IS A

if ( ChildClass instanceOd ParentClass ) siempre devuelve true . incluso todas las clases implementan interfaz A pasará la prueba de (AllClassess instanceOf A)

En su caso FolderInfo es un ItemInfo .

Le sugeriría que utilice Enumeration define todos los tipos.

Así es como se verá el código anterior:

 class View { public ItemInfo getTag() { return tag; } } enum ItemType { FolderType, FileType }; class ItemInfo { private abstract ItemType getType(); public View createItemView() { View v; // ... v.setTag(this); return v; } } class FolderInfo extends ItemInfo { private ItemType getType() { return ItemType.FolderType; } @Override public View createItemView() { View v; // ... v.setTag(this); return v; } } 

Que le permitirá escribir código mejor y ordenado como este :

 switch(itemType) { case ItemType.FolderType: //handle folder type break; case ItemType.FileType: //handle folder type break; } 

Y donde quieras comprobar el tipo que puedes comprobar como esto:

  if( itemInfo.getType() == ItemType.FolderType) { } 
  • ¿Por qué utilizar putFloat (clave de cadena, valor de flotante), putInt (clave de cadena, valor de int) en lugar de sobrecarga poner (...)
  • ¿Cómo realizar cambios en la interfaz de usuario de una Android AsyncTask?
  • Android, programación orientada a objetos vs diseñar para el funcionamiento
  • ¿Cómo implementar un singleton configurable?
  • Adición de un método de convieniencia a una clase existente (excepción de generación de clase)
  • ¿Qué es "Metodología de Desarrollo Evolutivo"?
  • Fragmento 2 fragmento de comunicación
  • Actividad y interacción de fragmentos
  • Patrón de diseño para acceder a los mismos datos de diferentes fuentes
  • ¿Por qué algunos códigos de Android tienen campos públicos?
  • ¿Cómo hacer esto más eficiente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.