我有一个名为Function
的抽象类,它有2个继承类(实际上是6,但是例如2)。
第一个继承类将被称为Push
,另一个将被称为Lift
。
基类将有简单的方法和成员,如Execute(int Distance)
,Direction
等。
但是子类会有个人和独特的成员,例如Push
将int friction
,Lift
将int gravity
(我的一个更复杂)
因此,如果我有List< Function >
,如果对象为gravity
,我将如何编辑Lift
成员?如果对象为friction
,我将如何编辑Push
?
请不要说“为什么不将Friction和gravity设置为相同的int,并将其放在基类中。”
我原以为基类可以有getData()
和setData()
,它可以使用数组,子类可以使用数组中的数据并以不同的方式处理它,同时能够发送不同的数据太。
答案 0 :(得分:4)
首先,如果您需要访问类的特定成员......您不应将它们视为List<Function>
。
话虽这么说,你应该可以做一些事情(使用is / as运算符):
foreach(var f in functions)
{
if(f is Push) { (f as Push).Friction = 4; }
if(f is Lift) { (f as Lift).Gravity = 4; }
}
答案 1 :(得分:1)
Justin Niessner的回答是正确的,但如果你更喜欢使用getter类型的implimentation,你可以使用属性
将以下内容放入基类
public virtual int DataItem {get; set;}
然后在Push
中,您可以覆盖该属性。为其他班级做同样的事情
public virtual int DataItem
{
get
{
return Friction;
}
set
{
Friction = value;
}
}
这样,你可以做类似
的事情int frictionOrGravity = item.DataItem;
答案 2 :(得分:0)
为什么不在基类中有一个抽象函数,它接受一些int,然后每个子类都可以用它需要的功能覆盖它?例如:
class Function {
protected abstract void SetData(int n);
}
class Push : Function {
int Friction;
protected override void SetData(int n) {
this.Friction = n;
}
}
class Lift : Function {
int Gravity;
protected override void SetData(int n) {
this.Gravity= n;
}
}
答案 3 :(得分:0)
我建议进一步考虑你的设计,这在这一点上听起来有缺陷。如果属性Friction
和Gravity
是派生类的无关成员,那么很难理解为什么要一起处理它们。
也许您需要的是基类中的新方法,我们称之为Update()
。然后,Push
和Lift
都可以分别实现Update()
方法,以便对各自的数据成员执行任何操作。
现在,您只需在每个Update()
对象上调用Function
:
List<Function> functions;
// ...
foreach (Function f in functions)
{
f.Update();
}
答案 4 :(得分:0)
如果可以的话,你也可以重构客户端代码以使用泛型。 作为字段/属性:List Functions {get; set;} 或者在方法中:列出GetFunction()