c#:如何获取继承传入对象的对象

时间:2015-05-08 13:14:46

标签: c# oop object inheritance

我正在制作游戏/游戏引擎并遇到以下问题:我有一个拥有“checkCollision(Wall W)”方法的玩家。它需要一个非常简单的物体墙,它有一些数据并检查与它的碰撞。这很好用。但现在我有了这个“门”对象,继承了对象“墙”。这个对象大致相同,但有一些额外的功能。现在我可以从这个门对象调用函数吗?所以门看起来像:class Door : Wall {} 函数checkCollsion:在函数player.checkCollision(Wall w)中输入一个墙:Door d1 i传递,例如player.checkCollision(d1)public void checkCollision(Wall w){ if(w.tag =="wall"){ //collision checking }else if(w.tag == "door"){ //collision checking //this is a function only "door" has: w.SomeMethodOnlyDoorHasAndWallLacks(); } } 。 现在我可以检查collison,它工作正常,但我如何从checkCollision函数内部作为墙传入的门调用函数?每个对象都有一个标签,一个墙壁标签=“墙”和一个门标签=“门”。 所以我checkCollision:

{{1}}

我怎么称呼这个功能?

提前感谢,

科迪

2 个答案:

答案 0 :(得分:2)

我不会从墙上继承门。创建一些基础对象或接口,并从中继承墙和门:

public abstract class EnvironmentObject
{
     // tag

     public bool CheckCollision()
     {
         // collision checking             
     }

     public abstract void Act();
}

现在,当在wall对象中实现Act时,您可以将其留空。在门对象中,您可以添加一些操作。碰撞检查看起来像

var objects = new EnvironmentObject[] { new Wall(), new Door() };

foreach(var obj in objects)
   if (obj.CheckCollision())
       obj.Act();

答案 1 :(得分:0)

变式1:

public void checkCollision(Wall w){
    if(w is Door){
        //collision checking
        //this is a function only "door" has:
        (w as Door).SomeMethodOnlyDoorHasAndWallLacks();
    }else
        // wall
    }
}

变体2:

定义基类中的碰撞检查方法:

class Wall
{
    public virtual void CheckCollision(some arguments)
    {
        // default collision check code
    }
}

class Door : Wall
{
    public override void CheckCollision(some arguments)
    {
        // overriden collision check code
    }
}