2017-02-20 3 views
0

Dies sollte eine ziemlich direkte Frage sein. Ich frage nur nach einfacheinfach zu verstehen Antwort. Nein, ich möchte keine Textbuchdefinition oder einen Link zur Dokumentation, bitte, wenn möglich, so einfach wie möglich beantworten.Erstellen eines Objekts einer geerbten Klasse in C#

Beachten Sie Folgendes:

class Monster 
{ 
    public int Hp { get; protected set; } 
    public string Name { get; protected set; } 

    public virtual void Attack() 
    { 
     Console.WriteLine("Monster attacking!"); 
    } 
} 

class Skeleton : Monster 
{ 
    public Skeleton() 
    { 
     Hp = 20; 
     Name = "Skeleton"; 
    } 
    public override void Attack() 
    { 
     Console.WriteLine("Skeleton attacking!"); 
    } 
} 

Jetzt stelle ich mir vor, wie so ein neues Skeleton-Objekt mit dem Typ Monster erstellen.

Monster skeleton = new Skeleton(); 

Ich möchte den Unterschied kennen ein Skeleton-Objekt mit einem Monster Typ gegen die Schaffung eines Skeleton-Objekt mit einem Skeleton Typ zwischen dem Erstellen.

Skeleton skeleton = new Skeleton(); 

Ich verstehe nicht, wenn es einen Unterschied zwischen den beiden gibt oder wirklich, wie das funktioniert. Irgendwelche Hilfe geschätzt! Vielen Dank!

+1

Ein Skelett * ist ein * Monster, aber ein Monster * muss nicht * ein Skelett sein, denk an einen Fall, wenn du eine Gruppe von Monstern mit ** vielen Typen hast und alle gleichzeitig angreifen Zeit ** –

+0

(Phun beabsichtigt) hoffe du denkst nicht an C#/oop als Monster (oop = Monster, C# = Skelett): D –

Antwort

3

Die Vorteile der Erstellung eines Skeleton Objekts mit einem Monster Typ werden deutlicher, wenn Sie mehrere Monster haben, die Sie in einer einzigen Sammlung halten möchten.

Zum Beispiel könnten Sie eine Liste haben wie folgt definiert:

List<Monster> EncounterMonsters = new List<Monster>(); 

Deklarieren Ihre Skeleton Objekt als Monster Sie es zu dieser Liste hinzufügen können, zusammen mit allen anderen Monster Klassen, die Sie erstellen.

So könnten Sie ein anderes Monster Klasse:

class Ogre : Monster 
{ 
    public Ogre() 
    { 
     Hp = 50; 
     Name = "Ogre"; 
    } 

    public override void Attack() 
    { 
     Console.WriteLine("Ogre attacking!"); 
    } 
} 

Man könnte dann wie folgt vorgehen:

Monster skeleton = new Skeleton(); 
Monster ogre = new Ogre(); 

EncounterMonsters.Add(skeleton); 
EncounterMonsters.Add(ogre); 

Dies würde dann können Sie eine Schleife durch die EncounterMonsters Sammlung und Angriff mit jeder mit die überschriebene Attack Methode für jeden.

+0

Absolut perfekte Antwort, vielen Dank. – Tony

+0

Das ist natürlich ziemlich simpel. Abhängig von deiner Anwendung müsstest du wahrscheinlich die HP jedes Monsters separat verfolgen, wenn sie angegriffen werden, aber es zeigt den Punkt. – Steve

+0

Ich gehe davon aus, dass es am besten wäre, ein Skelettobjekt vom Typ Skelett zu erstellen, es sei denn, ich hätte einen Grund, es nicht zu korrigieren. – Tony

1

Zum Erweitern der akzeptierten Antwort besteht der Unterschied darin, dass bei der Instanziierung Ihres Objekts mit der Basisklasse Monster nur die Eigenschaften und Methoden verfügbar sind, die von der Klasse Monster verfügbar sind.

Bedenken Sie:

public class Monster 
{ 
    public Monster(int hp, string name) 
    { 
     Hp = hp; 
     Name = name; 
    } 
    public int Hp { get; protected set; } 
    public string Name { get; protected set; } 
} 

public class Skeleton : Monster 
{ 
    public string Loot { get; set; } // <- Note added property. 
    public Skeleton(int hp, string name) : base(hp, name) 
    { 
     Loot = "Sword"; 
    } 
} 

public class Vampire : Monster 
{ 
    //- some vampire specific properties 

    public Vampire(int hp, string name) : base(hp, name) 
    { 
     // ... 
    } 
} 

Nun, wenn Sie Ihr Skelett als Monster instanziiert.

Monster skeleton = new Skeleton(100, "skully"); 
skeleton.Loot(); //- Will throw a compile time error. 

Wenn Sie es als Skelett instanziieren;

Skeleton skeleton = new Skeleton(100, "skully"); 
skeleton.Loot(); // Will return "Sword"; 

Dies ist nützlich, wenn Sie zum Beispiel ein Verfahren oder eine Dienstleistung, die auf gemeinsame Eigenschaften deines Monsters handeln, sagen Sie eine Methode, die die Statistiken eines Monsters protokolliert.

public string LogMonsterStats(Monster monster) 
{ 
    return $"{monster.Name} has {monster.Hp} health points"; 
} 

///.... 

Skeleton skeleton = new Skeleton(100, "Bob"); 
LogMonsterStats(skeleton); // returns "Bob has 100 health points" 

Beachten Sie, dass wir eine Skeleton-Instanz an eine Methode übergeben, die eine Monster-Instanz erwartet. So wird im Rahmen der Methode Bob wie ein Monster behandelt, nicht wie ein Skelett.

Verwandte Themen