我应该使用什么设计模式来更新类型为T的对象的值

时间:2014-04-18 15:53:34

标签: c# design-patterns

我有以下场景,我想弄清楚在for循环中放置什么样的设计模式。

查询将只返回香蕉或苹果。从不混合香蕉和苹果。我提前知道调用DoStuff时,是否会返回Bananas或Apples,因为我可以控制查询。

我一直在尝试通过接口作为DoStuff的第二个参数来设置香蕉的长度或苹果的直径。

有关我如何实现这一目标的任何建议?我需要DoStuff可以重复使用。

    public class BaseClass
    {

    }

    public class Apple : BaseClass
    {
        public int Diameter { get; set; }
    }

    public class Banana : BaseClass
    {
        public int Length { get; set; }
    }

    public void DoStuff(Query query)
    {
        // The query only ever returns bananas OR Apples. Never both.
        var items = repository.GetItems<BaseClass>(query);

        foreach (var item in items)
        {
            // Code to run some arbitrary calculation then set Length if Banana
            // Code to run some arbitrary calculation then set Diameter if Apple
        }
    }

3 个答案:

答案 0 :(得分:3)

如果没有派生类共享任何行为或数据,为什么要有基类?你应该研究Liskov Substitution原则(LSP)。 LSP基本上表示正确的系统遵循强烈的行为子类型,并且在多态方案中,当一种类型替换另一种类型时,它不会违反正确性等。

你明显违反了这个原则,因为它有两个没有共同点的子类。我建议你看一个不同的方法来解决这个问题,并提供你想要完成的更多细节,这样有人可以帮助你完成你需要的工作。

如果不了解您正在尝试做的事情,我建议采取以下措施:

public abstract class BaseClass
{
    public abstract void DoSomething();
}

public class Apple : BaseClass
{
    public int Diameter { get; set; }
    public override void DoSomething()
    {
        // Do something specific for Apple
    }
}
//...
public void DoStuff(Query query)
{
    // The query only ever returns bananas OR Apples. Never both.
    var items = repository.GetItems<BaseClass>(query);

    foreach (var item in items)
    {
        item.DoSomething();
    }
}

答案 1 :(得分:0)

您可以像这样编写DoStuff方法

public void DoStuff(Query query)
{
    // The query only ever returns bananas OR Apples. Never both.
    var items = repository.GetItems<BaseClass>(query);

    foreach (var item in items.OfType<Banana>())
    {
        // Code to set Length if Banana
    }
}

但我更喜欢Liskov Substitution原则......

答案 2 :(得分:-1)

我在DoStuff中将BaseClass作为抽象方法,并在Apple&amp; Banana

public class BaseClass
{
    // Stuff common to Apples & Bananas here

    public abstract void DoStuff(Query query);

}

public class Apple : BaseClass
{
    public int Diameter { get; set; }

    public override DoStuff(Query query)
    {
        // Implementation for Apples
    }
}

public class Bananas : BaseClass
{
    public int length { get; set; }

    public override DoStuff(Query query)
    {
        // Implementation for Bananas
    }
}