2016-05-27 9 views
-5

Die Frage ist theoretischer als die üblichen Fragen zum Stapelüberlauf. Meine Frage ist: Wenn Klasse A von Klasse B erbt, was ist/sind die richtigen Möglichkeiten, um Objekte zu initialisieren, wenn sie beide einen leeren Konstruktor haben (keine Parameter)?C#: Wie und wie wird ein Objekt nicht initialisiert?

Dies sind die Optionen:

  1. A a = new B();
  2. B b = neu A();
  3. A a = neu B() wie A;
  4. B b = neu A() wie B;

Ich denke, dass sowohl 1 als auch 3 möglich sind, aber ich bin mir wirklich nicht sicher. Kann jemand erklären, was richtig ist und warum?

+2

was genau versuchen Sie zu tun? –

+0

@ AD.Net: Das sind Fragen aus einer Beispielprüfung, ich bereite mich darauf vor, also würde ich mir wirklich sicher sein wollen. : D –

+0

@dbugger: so ist es das gleiche wie 1? und haben sie recht? –

Antwort

2

Kurze Antwort: es kommt darauf an. Wenn Sie ein Objekt vom Typ A möchten, verwenden Sie den Konstruktor A(). Wenn Sie ein Objekt vom Typ B möchten, verwenden Sie den Konstruktor B().

Um etwas konkreter zu machen, kommen hier die Tierklassen.

public class Giraffe : Animal {} 
public class Animal {} 

Dann wird Ihr Code wird

Animal a = new Giraffe(); // perfectly normal, imo 
//Giraffe b = new Animal(); compiler error! 
Animal a = new Giraffe() as Animal; // "as Animal" is redundant 
Giraffe b = new Animal() as Giraffe; // this is strange, but compiler is OK with it... not sure of a use case for this exact piece of code. 

Der Typ der Variablen nicht, dass alle viel bedeutet, es sei denn, Sie sind ein Feld oder eine Eigenschaft einer Klasse auszusetzen. In diesem Fall bedenken Sie, wie das Objekt für Außenstehende aussieht. Wenn Sie möchten, dass Außenstehende Ihr Feld/Ihre Eigenschaft als Objekt des Typs Animal anzeigen, verwenden Sie das. Gleiches für Typ Giraffe.

+0

Danke für die Antwort aber neben der Tatsache, dass es für den Benutzer klar sein sollte, welche die richtigen Wege sind, sind sie alle möglich oder sind nur einige möglich? –

+0

Siehe meine Revision. Mit "möglich" habe ich das gemeint, was der Compiler Ihnen erlauben wird. Denken Sie daran, dass "Typen" im Falle von C# wirklich nützlich sind, um CLR-Code zu generieren. Sobald das Objekt erstellt ist, ist es "wirklich" ein "Tier" oder "Giraffe" basierend auf den tatsächlichen Feldern, die es hat. Ich denke [eine Frage, die ich vor einiger Zeit gestellt habe, könnte helfen] (https://stackoverflow.com/questions/31128496/how-to-define-what-type-means). –

+0

Ok danke für die Überarbeitung, es hat viel geklärt :) –