我想知道我走的路是否正确,因为我觉得下面的代码是错误的。抱歉,我不知道如何正确命名这个问题。
我有一个用于从数据库加载数据的特定 ShapeEntity 类。 Shape 还有其他具体类(我将来可以有很多)所以我想使用 LSP 来绘制这些形状,这就是我使用 IShape 抽象的原因。我使用 ShapeEntity 提供的数据库信息来实例化具体的形状对象。
所以我关心的是在 Main() 函数中,我只使用简单的 if-else 来创建这些形状。这是使用 if-else block 创建“未知”对象的正确方法吗?也许我可以为某种 ShapeService 创建 Shape 对象?反过来怎么解决?
public class ShapeEntity
{
int idShape { get; set; }
}
public interface IShape
{
void Draw();
}
public class Square : IShape
{
public void Draw() { }
}
public class Rectangle : IShape
{
public void Draw() { }
}
public class Canvas()
{
public static void Main()
{
List<IShape> Shapes = new List<IShape>();
foreach(ShapeEntity ShapeItem in ShapeRepository.GetAll())
{
if(ShapeItem.idShape == 1)
{
Shapes.Add(new Square());
}
else if(ShapeItem.idShape == 2)
{
Shapes.Add(new Rectangle());
}
}
}
public void DrawShapesOnCanvas(IList<IShape> Shapes)
{
foreach(IShape Shape in Shapes)
{
Shape.Draw();
}
}
}
最佳答案
你应该考虑使用 Factory
模式而不是使用 Id
你应该使用 enum
例子:
public class ShapeFactory
{
public static IShape GetShape(ShapeType shapeType)
{
switch (shapeType)
{
case ShapeType.Square:
return new Square();
case ShapeType.Rectangle:
return new Rectangle();
default:
break;
}
return null;
}
}
public enum ShapeType
{
Square,
Rectangle
}
关于c# - LSP : conditional creation of objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713320/