2009-07-10 5 views
-1

私は名前がCarで、名前はNameです。今私は私の車の名前を変更したいときはいつも、私はCar1.Name = "Porka Turbo"と書く必要があります。今、私がacomplishしたいことは、このように書くことが5文字以下である:クラスに文字列を代入するとプロパティにリダイレクトされます

Car1 = "Porka Turbo" 

それは次のように動作するはずです:私は車のクラスからderrivedクラスを割り当てる場合には、通常のクラスの割り当てを行う必要がありますが、私は、文字列を割り当てるときこの文字列は "Name"というプロパティにリダイレクトされるはずです。

だから、同じ動作すること:この特定の例ではあまり書くこと

Car1.Name = "Porka Turbo" 

が、これはC#の.NET 3.5で可能ですし、ない場合は、他の方法を知っていますか?

+0

... – cjk

+0

私は私はintelisenseを持っていない必要があります。 – tomaszs

+0

これがあなたの状況にふさわしいと本当に思っているなら、あなたの状況について私たちにもっと教えてください。*わかりやすい解読法を試してみてください。 –

答えて

1

代入演算子をオーバーロードできないため、不可能です。

でもそれは可能ですが、私はそれをしてはいけません。あなたはそれで何を得ますか?
入力する必要がある文字の数が少なくなりますか? コードが書かれているよりもはるかに頻繁に読み込まれていることを心の奥に保ちます。
あなたは、読み取りを再とき/年または2の後にそのコードを確認し、私はあなたがあなたの頭の背中を数回引っ掻くことと思います...

加えて、オーバーロードすることが可能であると仮定代入演算子:

Car1に別のCarインスタンスを割り当てる場合はどうしますか?

Car1がNULLの場合はどうしますか?

+0

@Frederikはオペレータのオーバーロードメソッド(割り当てられているオブジェクトの型を使用して)に注意を払うことができますが、なぜ彼はこれを必要としますか?動機は何ですか? –

+0

1. Carインスタンスを渡すよりも、usuallのような通常のオブジェクト割り当てを使用します。 2. Car1が何も起こらないのにNULLになる場合 – tomaszs

+0

1:ok 2:not ok。これは予期せぬことです(私にはそうです)。 –

1

いいえ、C#では、代入演算子のオーバーロードを許可していません。

+0

他の方法で書き込むことはありませんか? – tomaszs

+0

プロパティ、変数、クラスなどすべてに単一文字の名前を使用します。コードは恐ろしいものになりますが、短くなります。 –

+0

@Jon Skeet - 私はすべてを短くする必要はありませんが、Nameプロパティだけです。以上です。名前はオブジェクト定義の不可欠な部分だと思いませんか? – tomaszs

2

あなたが探しているもの(おそらくそこにある)を達成する方法があるかどうかわかりませんが、私はそれが混乱しているので、そうすることに対して助言します。初心者にとっては、例のCar1インスタンスが文字列であるかのように動作し、コードが実際に何をしているかがはっきりしなくなります。

+0

はい、私はそれが明確ではないことを知っていますが、私はこの解決法を遂行したいと思います。 – tomaszs

4

Car1Carの変数であると仮定すると、それはできません。それは可読性の悪夢でもありません。

変数への代入は、代入演算子のRHS上の(おそらく変換された)値への変数の値の変更を意味する必要があります。あなたはオペレーターの意味を変えようとしています。

Car1.X("Porka Turbo"); 

それとも別のプロパティ:あなた単一文字のメソッドを作成することができ

Car1.Name = "Porka Turbo"; 

あなたがはるかに読みやすいの文字数に悩まさしている場合:

Car1.N = "Porka Turbo"; 

私はそれらのどちらもしません。コードをシンプルで読みやすいものにしておきます。あなたが将来のコードを維持しなければならない人は、可読性よりも「ソースの最小文字数」に優先順位を付けると感謝しません。

EDIT:まだ提示されていない1つのオプションは、stringからCarへの暗黙の変換を提供しています。それあなたが

Car1 = "Porka Turbo"; 

を書いてみましょうだろうが、それはは、既存の車の名前プロパティを変更することはないだろう - それは新しい車を作成し、CAR1にその値を割り当てることになります。私はこの問題について言及することなく他の誰かがオプションとしてドロップした場合にのみ言及します:)

+0

あなたが言っていることはまったく正しいので、私はdownvoteしないでしょう、そしてあなたはそのようなパターンが本当に実装されるべきでない理由についての適切な提案をしますが、何とかpolishwordsがこの代替案について。結局のところ、将来コードを維持しなければならない人は* me * :)かもしれません。 –

+0

私はそれが正しいことであるかどうか尋ねませんでした。 – tomaszs

+0

私の見解では、あなたがしようとしていることは不可能ではなく、非常に悪いアイデアであることをあなたに説明しないように私たちを黙らせます。 –

1

私はOOPの非常に深い誤解が最初にこの要求の根源だと思います。 C#のようなオブジェクト指向言語の良いことは、Car型のオブジェクトは常にCarであり、その他は何もありません。文字列は常に文字列になり、文字列は決して自動車にはなりません。二重引用符で囲まれたテキストを折り返すことは、新しい文字列インスタンスを作成するために短縮されます。新しいCarインスタンスを作成するための省略表現はありません。文字列に "Name"プロパティがないなどの理由で、「この文字列は実際には車です」とは決して言えません。場合は残念ながら、我々はインテリセンスを持っている理由です

私が言うことができる最善のことは、C#ので作業を続けると、すぐに十分なあなたは、これが=の場合であることを理解するために来る)

+0

私はこのソリューションをOOPだけでなく多くの観点から良くないものにすることができますが、私はこの解決法を遂行したいと思います。あなたはC#をもっと学び、私に答えを与えることを願っています。 – tomaszs

+0

「C#をもっと学ぶ」というケースではありません。幸いにもC#はこのような足であなた自身を撃つことはできません。オーバーロードされた代入演算子が必要な場合は、C++を使用します。 –

+0

@ジョン - 私はそれがC++で利用可能であることを知っていますが、いくつかの極端なケースでは便利ですし、C#でも利用できるはずです。だから私にその銃を与えて、私は私の足からこのバグを撃つことができます。 – tomaszs

関連する問題