通过基类访问非继承成员

时间:2012-01-24 19:19:13

标签: c#

我有一个名为Function的抽象类,它有2个继承类(实际上是6,但是例如2)。

第一个继承类将被称为Push,另一个将被称为Lift

基类将有简单的方法和成员,如Execute(int Distance)Direction等。

但是子类会有个人和独特的成员,例如Pushint frictionLiftint gravity(我的一个更复杂)

因此,如果我有List< Function >,如果对象为gravity,我将如何编辑Lift成员?如果对象为friction,我将如何编辑Push

请不要说“为什么不将Friction和gravity设置为相同的int,并将其放在基类中。”

我原以为基类可以有getData()setData(),它可以使用数组,子类可以使用数组中的数据并以不同的方式处理它,同时能够发送不同的数据太。

<小时/> 事实证明,我的问题有一个简单的解决方案。我只是试图允许用户设置每个对象的数据,这可以通过属性网格轻松完成。我保持当前的答案是可接受的,因为我的原始问题不够具体,不足以使我的解决方案具有相关性。

5 个答案:

答案 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)

我建议进一步考虑你的设计,这在这一点上听起来有缺陷。如果属性FrictionGravity是派生类的无关成员,那么很难理解为什么要一起处理它们。

也许您需要的是基类中的新方法,我们称之为Update()。然后,PushLift都可以分别实现Update()方法,以便对各自的数据成员执行任何操作。

现在,您只需在每个Update()对象上调用Function

List<Function> functions;
// ...

foreach (Function f in functions)
{
    f.Update();
}

答案 4 :(得分:0)

如果可以的话,你也可以重构客户端代码以使用泛型。 作为字段/属性:List Functions {get; set;} 或者在方法中:列出GetFunction()