[英]c#: how to get the object that inherited the passed in object
我在制作游戲/游戲引擎,遇到以下問題:我有一個具有“ checkCollision(Wall w)”方法的播放器。 它采用了非常簡單的對象牆,該對象牆具有一些數據並檢查與它的碰撞。 這很好。 但是現在我有了這個“門”對象,該對象繼承了“牆”對象。 這個對象幾乎是相同的,但是具有一些額外的功能。 現在我該如何從該門對象調用函數? 所以這扇門看起來像: class Door : Wall {}
函數checkCollsion:將一堵牆作為輸入。: player.checkCollision(Wall w)
我通過了例如player.checkCollision(d1)
中的Door d1
。 現在我可以檢查collison了,它工作正常,但是如何從checkCollision函數內部作為牆體傳入的門調用函數? ps每個對象都有一個標簽,而wall標簽=“ wall”,而door標簽=“ door”。 所以我的checkCollision:
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();
}
}
我怎么稱呼這個功能?
提前致謝,
科迪
我不會從牆繼承門。 創建一些基礎對象或接口,並從其繼承牆和門:
public abstract class EnvironmentObject
{
// tag
public bool CheckCollision()
{
// collision checking
}
public abstract void Act();
}
現在,在牆對象中實施Act
,可以將其保留為空。 在門對象中,您可以添加一些動作。 碰撞檢查看起來像
var objects = new EnvironmentObject[] { new Wall(), new Door() };
foreach(var obj in objects)
if (obj.CheckCollision())
obj.Act();
變體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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.