c# - LSP : conditional creation of objects

标签 c# oop

我想知道我走的路是否正确,因为我觉得下面的代码是错误的。抱歉,我不知道如何正确命名这个问题。

我有一个用于从数据库加载数据的特定 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/

相关文章:

c# - 不接收时检测端点关闭?

c# - 在继承类中隐藏虚函数

java - 实例是否应该使用 setter/getter 来访问它们自己的私有(private)数据成员?

c# - 如何在磁盘上写入电子邮件而不是发送到 asp.net 中的真实地址?

c# - 如何将错误消息显示为模式

c# - 如何使用 LDAP 实现基于资源/操作的授权?

c# - 启动任务和获取返回值的更好模式

c++ - 继承 c++ 子父

javascript - 在javascript中的对象中创建方法

c# - 这是对类型系统的滥用吗?