Я пытаюсь изучить лучшие практики программирования, используя принципы SOLID. Здесь я работаю над образцом приложения Shapes. Я просто хочу знать, я нарушаю принцип где угодно. Ниже приведены классы и его код.Является ли это нарушением моего принципа SOLID?
1. Базовый класс - 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. Классы для фигур, таких как прямоугольник, треугольник и т.д., реализующих базового класса Shape.
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. Фабрика класса, который возвращает форму.
internal class ShapeFactory<K, T> where T : class, K, new()
{
static K k;
private ShapeFactory() { }
public static K Create()
{
k = new T();
return k;
}
}
До здесь все кажется хорошо и выглядит хорошо, но проблема возникает, когда я реализовал его. Я здесь немного запутался. Давайте посмотрим на передний конце код первый:
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();
}
}
ВОПРОСЫ
Различных формы имеют различные свойства, такие как круг имеет радиус, треугольник имеет основание и высоту, и так далее, так что я решил сохранить свои свойства в классе детей. Я знал, я могу иметь это как виртуальный член в моем базовом классе. Так что есть какой-то другой способ, кроме закодированного выше.
Если нет, то в чем смысл абстрактного класса, если все же я приписываю объект Shape объекту окружности? Я могу просто использовать Circle c = new Circle(). Я не хочу нежелательных проверок вроде (если c - круг) и все.
Что если, меня попросят внедрить новый метод, чтобы получить Окружность круга. Мне нужно создать новый абстрактный класс или поместить его в класс Circle. Но если я ставлю Circle, я думаю, что это нарушит очень первый принцип SOLID, т. Е. SRP . Прошу прощения, я не являюсь моим абстрактным классом, как жирный класс, имеющий ненужные или повторяющиеся свойства.
Заранее спасибо
http://codereview.stackexchange.com/ был бы лучше подходит для этого вопроса – Papa