Schalter mit Objekt-Instanzen
Bearbeiten
Hier ist eine andere version von dem code, das macht es ein wenig mehr klar, was ich versuche zu tun:
class Program
{
static void Main(string[] args)
{
RepairCar(Car.Ferrari);
}
public static void RepairCar(Car BrokenCar)
{
switch (BrokenCar)
{
case Car.Ferrari:
Console.WriteLine("${0} of Insurance Needed", CalculateInsurance(BrokenCar));
//
//Repair Algorithm Here
//
break;
case Car.BMW:
Console.WriteLine("${0} of Insurance Needed", CalculateInsurance(BrokenCar));
//
//Repair Algorithm Here
//
break;
case Car.Audi:
Console.WriteLine("${0} of Insurance Needed", CalculateInsurance(BrokenCar));
//
//Repair Algorithm Here
//
break;
default:
Console.WriteLine("${0} of Insurance Needed", CalculateInsurance(BrokenCar));
//
//Repair Algorithm Here
//
break;
}
}
public static double CalculateInsurance(Car BrokenCar)
{
return (BrokenCar.Price / 10);
}
}
public class Car
{
public double Price;
public int MaxSpeed;
public int MinSpeed;
public Car(double Price, int MaxSpeed, int MinSpeed)
{
this.Price = Price;
this.MaxSpeed = MaxSpeed;
this.MinSpeed = MinSpeed;
}
public static Car Ferrari = new Car(100000, 250, 10);
public static Car Audi = new Car(50000, 120, 30);
public static Car BMW = new Car(35000, 80, 75);
}
Wie geschrieben, dieser Code wird nicht kompiliert, weil es wird nicht lassen Sie mich schalten Sie die BrokenCar in der RepairCar-Methode. Irgendwelche Vorschläge?
Original Post
Ich versuche, ein Objekt zu erstellen, speichern statische Eigenschaften und, noch wichtiger geschaltet werden kann, über - hier ein Beispiel -
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetMaxSpeed(Car.Ferrari));
Console.ReadLine();
}
public static int GetMaxSpeed(Car ModelType)
{
switch (ModelType)
{
case Car.Ferrari:
return Car.Ferrari.MaxSpeed;
case Car.VW:
return Car.VW.MaxSpeed;
case Car.AstonMartin:
return Car.AstonMartin.MaxSpeed;
}
}
public class Car
{
public int MinSpeed;
public int MaxSpeed;
public Car(int MinSpeed, int MaxSpeed)
{
this.MinSpeed = MinSpeed;
this.MaxSpeed = MaxSpeed;
}
public static Car Ferrari = new Car(30, 240);
public static Car VW = new Car(10, 50);
public static Car AstonMartin = new Car(75, 180);
}
}
Hat jemand irgendwelche Ideen?
Vielen Dank im fortgeschrittenen!
William
BEARBEITEN
In diesem Beispiel wird ein größeres, Komplexes system. Um zu veranschaulichen, warum ich das hätte tun müssen, es auf diese Weise, sehen Sie das folgende update:
public static void OnCarSale(Car CarSold)
{
double LuxuryTax = 75;
switch (CarSold)
{
case Car.Ferrari:
Console.WriteLine("Total Price: {0}", Car.Ferrari.Price + LuxuryTax);
break;
case Car.VW:
Console.WriteLine("Total Price: {0}", Car.VW);
break;
case Car.AstonMartin:
Console.WriteLine("Total Price: {0}", Car.Ferrari.Price + LuxuryTax);
break;
}
}
Dies würde zu erhalten, genannt, die durch ein Ereignis außerhalb dieser Klasse -
Können Sie nicht einfach
return ModelType.MaxSpeed
? Ist es ausdrücklich verboten?
InformationsquelleAutor William | 2011-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, was Sie es verwenden möchten. Wenn der "Schalter" geben, die Autos extra Verhalten, legen Sie es in der Klasse selbst. Zum Beispiel, in Ihrem Fall, Sie haben bereits das entsprechende Feld (ick öffentlichen Bereichen, aber...) Sie können nur verwenden:
In anderen Fällen kann Ihnen der Typ eine Methode, und Sie können geschachtelte Klassen implementieren die Methoden, die unterschiedlich auf der Basis der verschiedenen Werte. Geben Sie die "base" - Klasse ein private-Konstruktor sowie die abstrakten Methoden, dann abgeleitete Klassen als geschachtelte Klassen, so dass Sie immer noch mit dem privaten Konstruktor und setzen bestimmte Werte. Ich nenne diese Typen "smart enums".
Wenn Sie möchten, anzeigen jeder Wert zu einem anderen Wert, verwenden Sie eine
Dictionary<Car,string>
(oder was auch immer). Wenn Sie möchten, anzeigen jeder Wert, eine Aktion, eineDictionary<Car, Action>
.Grundsätzlich nicht in der Lage sein zu wechseln, es sei denn, Sie haben ein enum oder einige Integrale Typ... und das würde in der Regel ein Schmerz sein. Mit einem Wörterbuch ist oft ein einfacher Ansatz.
Wenn Ihnen geben kann, ein realistischeres Beispiel ist das nicht so leicht gelöst werden, können wir mehr helfen...
enum
s mit Eigenschaften, Methoden etc. In C# können Sie emulieren, dass (mit crappier syntax) public readonly Instanzen, aber dann verlieren Sie die Fähigkeit zu verwendenswitch
...Ja, ich Stimme (wie gesagt ich hab an verschiedenen Orten 🙂
InformationsquelleAutor Jon Skeet
Direkt Ihre Frage zu beantworten, machen ModelType ein enum und switch-off-Wert. Die Wagen haben ein ModelType-Eigenschaft als "Modell" im Beispiel unten.
Aber die bessere Frage ist, warum bist du nicht mit Polymorphismus? Sie können Auto eine Basis geben und haben verschiedene Modelle, die von Ihr Erben. Die Basis Auto-Typ sollte eine MaxSpeed-Eigenschaft. Egal, was der Unterklasse, die Sie haben, Erben von Auto, können Sie auf MaxSpeed zu bekommen, den Wert der Eigenschaft für das bestimmte Modell. Dies könnte über-komplizieren dein Beispiel (Hausaufgaben?), aber es würde Ihren code noch mehr OOP.
Wenn Sie möchten, um eine Garagen-Klasse mit einer Liste von Autos, würde es wie folgt Aussehen. Denken Sie daran, dies ist sehr grob-code, aber es zeigt Ihnen, was Rede ich, in den Kommentaren.
Okay, ich sehe, was du jetzt meinst, dass ich einen genaueren Blick nehmen. Siehe mein update, ich habe ein besseres Beispiel Polymorphismus.
Das einzige Problem mit der zweiten Lösung ist, dass ich versuche, Ferrari werden auf eine statische Eigenschaft einer größeren Objekt - im Grunde wie wenn es eine Garage Klasse, die übergeben wurde, von einem Ereignis und Garage Klasse eine statische Eigenschaft namens Auto FirstCar und dann möchte ich einen Schalter auf FirstCar, um zu bestimmen, ob es ein Ferrari, ein VW oder was auch immer -
Wenn Sie eine statische Eigenschaft in eine container-Klasse, nur machen die Auto-Instanz static innerhalb der container-Klasse und die 'Get' zurück Auto.MaxSpeed. Es funktioniert immer noch mit Polymorphismus. Aber die enum-Ansatz ist gut, für diesen einfachen Fall. Pick-je nachdem, was Sie fühlen, wie die macht Ihrer Umsetzung stärker in Ihrem Szenario.
aber wie kann ich den switch über die Instanzen von dem Auto?
InformationsquelleAutor Jordan Parmer
Werden Sie nicht in der Lage, dies zu tun, weil C# unterstützt nur compile-time-Konstanten für Schalter-Fällen. Stattdessen sollten Sie verwenden if/else-Blöcken.
InformationsquelleAutor Thomas Levesque
Ich würde, nur auf Allgemeine Grundsätze, erstellen Sie ein Wörterbuch für diese Instanzen (oder pflegen Sie nur eine Liste) statt der Umstellung auf Sie. Switch-Anweisungen sind manchmal notwendig, aber Sie sind selten "SOLID" - code; jedes mal, wenn eine neue Art von Auto erstellt haben, müssen Sie ändern Sie die switch-Anweisung zur Handhabung dieser neuen Fall.
Wenn Sie einfach hätte wechseln können auf Objekt-Referenzen, versuchen Sie, die Umstellung auf eine private-integral-type-Feld eindeutig zu identifizieren, die ein Auto; ein ID-Feld. Dann können Sie vergleichen, IDs innerhalb der switch-Anweisung anstelle von Referenzen.
Sie können versuchen Sie, das Auto als const. Dies würde besonders gut funktionieren, wenn Auto wurden ein struct.
InformationsquelleAutor KeithS