【发布时间】:2015-01-16 19:33:07
【问题描述】:
我正在尝试解决一个让我头疼的涉及多态性的问题。代码是这样的:
public abstract class Base
{
public int val {get;set;}
public virtual bool merge(Base obj) { return false; }
}
public class A : Base
{
public override bool merge(Base obj)
{
/* If obj is of type A sum the "val" and return true, otherwise retur false */
}
}
public class B : Base
{
public override bool merge(Base obj)
{
/* If obj is of type B sum the "val" and return true, otherwise retur false */
}
}
public class Composite
{
List<Base> objects;
public void addObject(Base obj)
{
foreach(Base b in this.objects)
{
if (b.merge(obj))
return;
}
this.objects.Add(obj);
}
}
我想要实现的是,在将 obj 添加到 Composite 类时,使要添加的对象“合并”到具有相同类型的对象,否则将其添加到列表中。我想在不使用“if”语句或检查对象类型的情况下对这种行为进行编码
编辑:将对象添加到 Composite 类时,我希望使用要添加的对象的值来更新 Composite 中的对象。所以如果我有:
Composite C = new Composite();
C.addObject(new A(2));
C.addObject(new B(10));
// here C has { (A,2) , (B,10) }
C.addObject(new A(1));
// here C should have { (A,3) , (B,10) }
到目前为止,我想出了一个稍微复杂的解决方案,它不涉及“if”语句:
public abstract class Base
{
public int val {get;set;}
public virtual bool tryMerge(Base obj) { return false; }
public virtual bool mergeA(A obj) { return false; }
public virtual bool mergeB(B obj) { return false; }
}
public class A : Base
{
public override bool tryMerge(Base obj)
{
return obj.mergeA(this);
}
public override bool mergeA(A obj)
{
obj.val += this.val;
return true;
}
}
public class B : Base
{
public override bool merge(Base obj)
{
return obj.mergeB(this);
}
public override bool mergeB(B obj)
{
obj.val += this.val;
return true;
}
}
public class Composite
{
List<Base> objects;
public void addObject(Base obj)
{
foreach(Base b in this.objects)
{
if (b.tryMerge(obj))
return;
}
this.objects.Add(obj);
}
}
有什么建议吗? 提前致谢!
【问题讨论】:
-
目前尚不清楚
val值的总和会发生什么情况。应该将其分配给对象本身的val属性、参数对象,还是两者兼而有之? -
另外,
mergeA和mergeB方法不应退出。基础中应该只有merge方法,它在A和B中都被覆盖,如上面的示例代码所示。 -
看来您要求的是更好的算法,那么您应该在codereview.stackexchange.com提出您的问题
-
当您调用
addObject(obj)时,Composite.objects 中与您的obj类型匹配的第一个项目将被合并,而 Coposite 类中具有相似类型的其余项目将被忽略。你知道吗? -
CarbineCoder 我知道这一点,但是对于扩展 Base 的每种类型,Composite 应该只有一个对象。 ;)
标签: c# .net oop polymorphism