我正在尝试使用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;
}
}
一个返回形状的工厂类。
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对象?我可以简单地使用Circle c = new Circle()。我不想要不需要的检查,如(if c is circle)等。
如果我被要求实现一个新方法来获取圆的周长,该怎么办?我需要创建一个新的抽象类还是将其放入Circle类中?但是,如果我将它放在Circle中,我认为它会违反SOLID的第一原则,即SRP。请注意,我不希望我的抽象类成为具有不必要或重复属性的大类。
提前致谢