簡體   English   中英

C#:如何獲取繼承傳入對象的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM