我有以下场景,我想弄清楚在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
}
}
答案 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
}
}