3 Stimmen

Vererbung von Klassen

Ich habe zwei Klassen:

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;
    }
}

Dann benutze ich es:

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

Dann prüfe ich den Typ von objectTag durch instanceof, und es ist ItemInfo! Warum?

8voto

Jesper Punkte 193903

Wenn Sie dies tun:

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

Sie werden natürlich sehen "OK!" gedruckt werden, weil FolderInfo ist eine Unterklasse von ItemInfo - also ein FolderInfo ist auch ein ItemInfo Objekt.

Vererbung bedeutet, dass es eine "ist ein"-Beziehung zwischen der Unterklasse und der Oberklasse gibt - siehe Liskov-Substitutionsprinzip .

1voto

robi terebesi Punkte 65

Sie können dies durch Eingabe überprüfen:

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

0voto

amicngh Punkte 7723

InstanceOf ist eine Prüfung auf IS A Beziehung.

wenn( ChildClass instanceOd ParentClass ) liefert Ihnen immer true . sogar alle Klassen implementieren die Schnittstelle A wird den Test von (AllClassess instanceOf A)

In Ihrem Fall OrdnerInfo es un ArtikelInfo .

0voto

Ramesh PVK Punkte 14970

Ich würde vorschlagen, dass Sie Enumeration Definition aller Typen .

Der obige Code sieht folgendermaßen aus:

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;
  }
}

Damit können Sie besseren und sauberen Code wie diesen schreiben :

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

Und wo immer Sie den Typ überprüfen wollen, können Sie dies so tun:

  if( itemInfo.getType() == ItemType.FolderType) {
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X