2011-01-28 12 views
3

は考える:c#タイプ= new type()のポイントは何ですか?

myObject hello = new myObject(); 

コードの行の第二部で再びmyObjectという指定のポイントは何ですか?

あなたが今までのようなものだろう:

myObject hello = new anotherObject(); 

なぜだけではなく、

myObject hello = new(); 
+2

を動作しないでしょうSubAまたはSubB

次のインスタンスを生成してもBaseとして変数を宣言したいかもしれませんVARの一時=新しいです() ;おかしい。コンパイラが正しいと思ったら、恐ろしいです...しかし真剣に、私はあなたが示唆する短い記法が好きです。 –

+1

'Mammal m = new Giraffe();'はどうですか?多くの場合、暗黙の型定義を使うことができます: 'var a = new Dictionary >();' – Ani

+1

C++のようなものを考えると、MyObject hello(params) ;それはMyObjectと等価かもしれませんhello = new MyObject(params); – WiredPrairie

答えて

3

はいあなたは

MyObject hello = new AnotherObject()を行うことができますが、

AnotherObjectがMyObjectのサブクラスである場合。

+1

AntotherObjectはMyObjectのサブクラスである必要はありません。私自身の答えで示しているように、必要なのは、AnotherObjectがMyObjectの型に準拠していることだけです。サブクラスが1つの特定のケースです。別の可能性は、MyObjectがインタフェースであり、AnotherObjectがそれを実装していることです。 – CesarGon

7

基本多型。 myObject hello = new derivesFromMyObject()と言うことができます。

3

多型について聞いたことがありますか?

ような割り当て:あなたが作成されたオブジェクトの実際の型を指定することができませんでしたので、

myObject hello = new(); 

は、それは不可能になるだろう。

変数の型と変数が指すオブジェクトの型が同じであると想定してはいけません。それがpolymorphismの基本です。例:

Vehicle a = new Car(); 
Vehicle b = new Bike(); 

ほとんどの言語で、オブジェクトの型は変数の型に準拠している必要があります。ほとんどのオブジェクト指向言語では、これは、オブジェクトの型が変数の型の同じ型、サブ型、または実装(cfr。interfaces)でなければならないことを意味します。オブジェクト継承/多型の可能性を考えると

+2

@CesarGon:あなたが正しい間、私はまだ質問が面白いと思う。どのくらいの頻度で基本型の変数を宣言し、特殊な型を作成するために 'new'キーワードを使用した*現実世界の例が出現しますか?その可能性はなくなるはずではないが、 'MyType temp = new();'のような略記法は、おそらく大部分のケースを処理するだろう。それ以外の場合は、 'MyType temp = new YourType();'と言うことができます。私はdownvoting、btw。 –

+0

@FredrikMörk:はい、怠惰なプログラマーにとっては便利です。 :-)しかし、C#は逆になり、可能な限り明示的にすべてを行います(たとえば、必要な仮想宣言と上書きの宣言を参照)。もちろん、他の言語は異なっています。 – CesarGon

+0

@Fredrik:抽象型の変数を作成している場合、** newでインスタンス化することはできません。 – Crisfole

4

は、[はい、あなたはいくつかの点で行うことができます:

BaseObject A = new ChildObject(); 
0
myObject hello = new myObject(); 

「をmyObjectというハローは、」オブジェクトを宣言します。

"myObject()"はmyObjectのコンストラクタを呼び出します...オブジェクトのさまざまなフレーバーを作成するために、さまざまなパラメータセットを使用するコンストラクタが複数ある可能性があります。

3

とまず、(varキーワードを使用して)他の唯一の方法ラウンド二回、解決されたタイプを明記の問題点:

var someClass = new SomeClass(); 

とははい、変数を持つことが有用であることが多いです

BaseClass b = new ChildClass(); 

又は

1
MyInterface i = new ClassThatImplementsInterface(); 
:のような、実際のインスタンスよりも、別の型の宣言

これがC#言語の定義方法です。

左側のタイプの仕様は、右側のタイプの仕様とはあまり関係ありません。左側の型の指定により、変数の型が指定されました。右側の型の指定は、インスタンス化する型を指定します。

varキーワードは、この問題を解決するが、あなたの例から、周りの他の方法なので、次のように入力します。

var hello = new myObject(); 
私が思うに十分な閉じる

を。

1

私は同じ質問も疑問に思っています。

ポリモルフとサブタイプを一切使用しない場合は、同じ行にオブジェクトを作成してインスタンス化すると(例のように)、A a = new();構文を受け入れる必要があります...

反復したくない場合は代わりにvarキーワードを使用できますが、既知の型のvarが気に入らないので、コードが少し複雑になります。

+0

varは*既知の型でしか使用できないことを認識していますか?実行時に型が決定できない場合、 'var'を正当に使用することはできません。 – Crisfole

+0

おっと、私は "コンパイル時間" – Crisfole

+0

varは、例えばlinqクエリの出力のように、匿名型を作成する機能を提供するために導入されました。既知の型によって、私は "定義された明白な"型、つまりプリミティブ型について話していました... – AFract

1

あなたはvarキーワード

var hello = new myObject(); 

は、それはちょうど反対側に、同じ単純化されています。

クラス階層がある場合に使用されます。

class Base {} 

class SubA : Base {} 

class SubB : Base {} 

その後、あなたは、私が `見つけるだろうあなたが

SubA hello = new SubA(); 
hello = new SubB();