我正在制作游戏/游戏引擎并遇到以下问题:我有一个拥有“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}}
我怎么称呼这个功能?
提前感谢,
科迪
答案 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
}
}