Ich versuche, bessere Programmierpraktiken mit SOLID-Prinzipien zu lernen. Hier arbeite ich an einer Beispielanwendung von Shapes. Ich möchte nur wissen, ob ich das Prinzip irgendwo durchbringe. Nachstehend sind Klassen und ihr Code.Brich dies mein SOLID-Prinzip?
1. Basisklasse - Shape
public abstract class Shape
{
public abstract double Area();
public virtual double Volume()
{
throw new NotImplementedException("You cannot determine volume from here...Method not implemented.");
}
}
2. Klassen für Formen wie Rechteck, Dreieck usw. Implementierung Basisklasse Form.
public class Circle : Shape
{
public int Radius { get; set; }
public override double Area() { return 3.14 * Radius * Radius; }
}
public class Triangle : Shape
{
public int Height { get; set; }
public int Base { get; set; }
public override double Area()
{
return 0.5 * Base * Height;
}
}
public class Rectangle : Shape
{
public int Length { get; set; }
public int Breadth { get; set; }
public override double Area()
{
return Length * Breadth;
}
}
public class Square : Shape
{
public Square() { }
public int Side { get; set; }
public override double Area()
{
return Side * Side;
}
}
3. Eine Fabrik-Klasse, die Form zurückkehrt.
internal class ShapeFactory<K, T> where T : class, K, new()
{
static K k;
private ShapeFactory() { }
public static K Create()
{
k = new T();
return k;
}
}
Bis hier alles scheint in Ordnung und sieht gut aus, aber Problem tritt auf, wenn ich es umgesetzt. Ich bin hier etwas verwirrt. Lässt das vordere Ende Code zuerst sehen:
internal class Program
{
private static void Main(string[] args)
{
try
{
var c = ShapeFactory<Shape, Circle>.Create();
// this part is not clear to me. See the questions below
if(c is Circle)
{
var circle = c as Circle;
circle.Radius = 5;
Console.WriteLine(string.Format("{0}", circle.Area()));
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
Console.Read();
}
}
FRAGEN
Verschiedene Formen hat bekam unterschiedliche Eigenschaften wie Kreis hat Radius, Dreieck hat Grundfläche und Höhe und so weiter, so habe ich beschlossen, meine Eigenschaften zu halten in der Kinderklasse. Ich wusste, dass ich das als virtuelles Mitglied in meiner Basisklasse haben kann. Gibt es einen anderen Weg als oben beschrieben?
Wenn nicht, was ist dann die Verwendung der abstrakten Klasse, wenn ich immer noch mein Shape-Objekt in ein Kreisobjekt umwandele? Ich kann einfach Circle c = new Circle() verwenden. Ich möchte keine unerwünschten Überprüfungen wie (wenn c Kreis ist) und alle.
Was wäre, wenn ich gebeten werde, eine neue Methode zu implementieren, um den Umfang eines Kreises zu erhalten. Muss ich eine neue Klasse Abstract erstellen oder in die Circle-Klasse einfügen? Aber wenn ich es Circle schreibe, denke ich, es wird das erste Prinzip von SOLID brechen, d. H. SRP . Bitte beachten Sie, dass ich meine abstrakte Klasse nicht als eine Fettklasse mit unnötigen oder wiederholten Eigenschaften habe.
Vielen Dank im Voraus
http://codereview.stackexchange.com/ wäre besser für diese Frage geeignet – Papa