2009-07-10 7 views
-1

Ich habe eine Klasse namens Auto mit Eigenschaft Name. Jetzt jedes Mal, wenn ich den Namen meines Autos ändern möchte, muss ich Car1.Name = "Porka Turbo" schreiben. Nun, was ich zu erledigenden mag, ist 5 Zeichen weniger wie folgt zu schreiben:Zuweisen einer Zeichenfolge zu Klasse leitet es an Eigenschaft um

Car1 = "Porka Turbo" 

Es sollte so funktionieren: Wenn ich eine Klasse zuweisen von Car-Klasse schließt man sollte es regelmäßige Klassenzuordnung machen, aber wenn ich assign string In meiner Klasse sollte diese Zeichenfolge in die Eigenschaft namens "Name" umgeleitet werden.

also, dass sie die gleiche wie funktioniert:

Car1.Name = "Porka Turbo" 

Ist das möglich in C# .NET 3.5 und wenn nicht kennen Sie eine andere Methode in diesem Beispiel weniger zu schreiben?

+0

diesem Grund haben wir intellisense haben ... – cjk

+0

Leider ich bei brauche ich, ich habe keine Intellisense. – tomaszs

+0

Wenn Sie wirklich denken, dass dies das Richtige für Ihre Situation ist, müssen Sie uns mehr über Ihre Situation erzählen - wir können wahrscheinlich eine bessere Lösung ausarbeiten, die die Lesbarkeit nicht aufhebt. –

Antwort

1

Dies ist nicht möglich, da der Zuweisungsoperator nicht überladen werden kann.

Selbst es wäre möglich, ich sollte es nicht tun. Was gewinnst du damit?
Ein paar weniger Zeichen, die Sie eingeben müssen? Behalten Sie die Tatsache im Hinterkopf, dass Code viel öfter gelesen wird, als er geschrieben wurde.
Wenn Sie diesen Code nach einem Jahr oder 2 erneut lesen, denke ich, dass Sie ein paar Mal den Hinterkopf kratzen werden ...

Nehmen Sie außerdem an, dass es möglich wäre, die Zuweisungsoperator:

Was tun Sie, wenn Sie Car1 eine andere Car-Instanz zuweisen möchten?

Was werden Sie tun, wenn Car1 NULL ist?

+0

@Frederik, das bei der Überladungsmethode des Operators beachtet werden kann (unter Verwendung des Typs des zugewiesenen Objekts), aber warum benötigt er dies, keine gute Programmierpraxis. Was ist das Motiv? –

+0

1. Wenn Sie die Car-Instanz übergeben, wird die normale Objektzuordnung wie üblich verwendet. 2. Wenn Car1 NULL ist, passiert nichts – tomaszs

+0

1: OK 2: nicht ok. Dies wird unerwartet (für mich) sein. –

1

Nein, mit C# können Sie den Zuweisungsoperator nicht überlasten.

+0

Gibt es eine andere Möglichkeit, weniger zu schreiben? – tomaszs

+0

Verwenden Sie einzelne Zeichen Namen für alles - Eigenschaften, Variablen, Klassen usw. Der Code wird schrecklich sein, aber es wird kürzer sein. –

+0

@ Jon Skeet - Ich brauche nicht alles kürzer, aber nur Name Eigentum. Und das ist es. Der Name ist wesentlicher Bestandteil einer Objektdefinition, meinst du nicht? – tomaszs

2

Ich weiß nicht, ob es einen Weg gibt, das zu erreichen, wonach Sie suchen (vielleicht gibt es), aber ich rate Ihnen davon ab, da ich es verwirrend finden würde. Für den Anfang würde es die Car1 Instanz in Ihrem Beispiel so tun, als ob es eine Zeichenfolge wäre (was nicht der Fall ist), und es wird weniger klar sein, was der Code tatsächlich tut.

+0

Ja, ich weiß, es ist nicht klar, aber ich möchte diese Lösung erstellen. – tomaszs

4

Angenommen Car1 ist eine Variable vom Typ Car, Sie können es nicht tun. Du solltest es auch nicht - es ist ein Albtraum der Lesbarkeit.

Die Zuweisung zu einer Variablen sollte eine Änderung des Werts der Variablen in den (möglicherweise konvertierten) Wert auf der RHS des Zuweisungsoperators bedeuten. Sie versuchen, die Bedeutung des Operators zu ändern.

Wenn Sie sich durch die Anzahl der Zeichen in der Mühe weit besser lesbar:

Car1.Name = "Porka Turbo"; 

Sie könnte erstellen einen einzigen Buchstaben Methode:

Car1.X("Porka Turbo"); 

Oder eine andere Eigenschaft :

Car1.N = "Porka Turbo"; 

Ich würde aber keines von beiden tun. Halten Sie den Code einfach und lesbar.Wer auch immer den Code in der Zukunft pflegen muss (möglicherweise auch Sie), wird es Ihnen nicht danken, wenn Sie "Mindestanzahl von Zeichen in der Quelle" der Lesbarkeit vorziehen.

BEARBEITEN: Eine Option, die noch nicht vorgestellt wurde, bietet eine implizite Konvertierung von String zu Auto. Die würde können Sie

schreiben
Car1 = "Porka Turbo"; 

aber es würde den Namen nicht Eigentum des bestehenden Autos zu ändern - es würde ein neues Auto erschaffen und diesen Wert zu Car1 zuweisen. Ich erwähne dies nur für den Fall, dass jemand anderes das als Option eingibt, ohne das Problem damit zu erwähnen :)

+0

Ich werde nicht ablehnen, weil das, was Sie sagen, vollkommen richtig ist, und Sie geben die richtigen Vorschläge, warum solche Muster nicht wirklich implementiert werden sollten, aber irgendwie hätte ich es trotzdem bevorzugt, wenn polishwords es nicht herausfinden würde über diese Alternative.Wer auch immer den Code in Zukunft pflegen muss, könnte * ich * sein :) –

+0

Ich habe nicht gefragt, ob es das Richtige ist, sondern wie man es macht. – tomaszs

+0

Aus meiner Sicht wäre es nachlässig von uns, Ihnen nicht zu erklären, dass das, was Sie versuchen zu tun, nicht nur unmöglich ist, sondern auch eine * sehr schlechte Idee *. –

1

Ich denke, ein sehr tiefes Missverständnis von OOP ist die Wurzel dieser Anfrage, an erster Stelle. Die gute Sache mit einer objektorientierten Sprache wie C# ist, dass ein Objekt vom Typ Auto immer ein Auto sein wird, und sonst nichts. Ein String ist immer ein String und ein String wird niemals ein Car sein. Das Umbrechen eines Texts in doppelte Anführungszeichen ist eine Abkürzung für das Erstellen einer neuen Zeichenfolgeninstanz. Es gibt keine solche Kurzschrift zum Erstellen einer neuen Car-Instanz. Sie können niemals sagen, dass "Diese Zeichenfolge tatsächlich ein Auto ist", aus Gründen wie etwa der Tatsache, dass ein String nicht die Eigenschaft "Name" hat.

Das Beste, was ich sagen kann, ist, halten Sie mit C# zu arbeiten, und bald genug werden Sie zu schätzen wissen, dass dies der Fall ist =)

+0

Ich kann viele Dinge sagen, die diese Lösung aus vielen Blickwinkeln nicht gut machen, nicht nur OOP, sondern ich würde gerne diese Lösung erstellen und das ist alles. Ich hoffe du lernst C# mehr und gibst mir die Antwort. – tomaszs

+0

Es ist kein Fall von "C# mehr lernen". Glücklicherweise lässt C# dich nicht so in den Fuß schießen. Wenn Sie einen überladenen Zuweisungsoperator verwenden möchten, verwenden Sie C++. –

+0

@Jon - Ich weiß, dass es in C++ verfügbar ist und in einigen extremen Fällen ist es nützlich und ich denke, dass das gleiche in C# verfügbar sein sollte. Also, gib mir diese Waffe, damit ich diesen Käfer von meinem Fuß abschießen kann. – tomaszs