2016-05-27 8 views
-5

質問は、スタックオーバーフローに関する通常の質問よりも理論的です。 私の質問は:クラスAからクラスBを継承する場合、両方とも空のコンストラクタ(パラメータなし)を持っている場合、オブジェクトを初期化する正しい方法は何ですか?C#:どのようにしてオブジェクトを初期化しないのですか?

これはオプションである:

  1. A =新しいB();
  2. B b = new A();
  3. A =新しいB()をA;
  4. B b = new A()をBとする。

私は1と3の両方が可能だと思いますが、私は本当に分かりません。 誰かが正しいと理由を説明することができますか?

+2

あなたは正確に何をしようとしていますか? –

+0

@ AD.Net:これは模範試験の質問ですが、私はそれを確かめるために準備をしています。 :D –

+0

@dbugger:1と同じですか?彼らは正しいのですか? –

答えて

2

短い回答:それは依存しています。

タイプAのオブジェクトが必要な場合は、コンストラクタA()を使用します。タイプBのオブジェクトが必要な場合は、コンストラクタB()を使用します。

さらに具体的にするには、ここでは動物クラスがあります。

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

次に、あなたのコードは、クラスのフィールドまたはプロパティを露出している場合を除き、多くのすべてのことを意味するものではありません

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. 

変数の型になります。この場合、オブジェクトが外部者にどのように見えるかを考慮してください。外側にタイプAnimalのオブジェクトとしてフィールド/プロパティを表示するには、それを使用します。タイプGiraffeと同じです。

+0

答えに感謝しますが、正しい方法は何かをユーザーに明確にすべきであるという事実のほかに、それらはすべて可能であるか、またはいくつか可能ですか? –

+0

私のリビジョンを参照してください。 "可能"とはコンパイラがあなたにできることを意味するものです。 C#の場合、「型」は実際にはCLRコードを生成するのに便利です。オブジェクトが作成されると、それは実際のフィールドに基づいて「動物」または「キリン」です。私は[私が以前に尋ねた質問](https://stackoverflow.com/questions/31128496/how-to-define-what-type-means)と思う。 –

+0

改訂ありがとうございます、それは多くをクリアしました:) –

関連する問題