2014-12-07 68 views
0

我有3個不同的對象,我們可以稱它們爲:Box,Square,Triangle。現在,我想創建一個需要傳遞對象的更新函數。據我所知,該功能應該是這樣的在C中使用對象#

void Update(Box box, Square square, Triangle triangle) 
{ 
    //do something 
} 

這就要求我通過這三個對象即使有時我想更新只是其中之一。我知道的另一種方法是通過在構造函數中初始化對象並將它們傳遞給類中的私有變量。然後我會更新所有的對象,無論我是否想要更新所有對象。

void Update() 
{ 
    //do something for Box 
    //do the same for Square 
    //do the same for Triangle 
} 

這將需要很多代碼,有時是不必要的。現在,有什麼辦法可以通過我想要的任何對象,並執行相同的代碼。例如,

void Update(Object randomObject) 
{ 
    //do something for the randomObject whether its Square, Box or Triangle 
} 
+0

爲什麼在每個類中都沒有Update方法?那麼每個實例都可以自行更新?或者從一個強制每個派生類實現一個Update方法的抽象基類派生三個類?你的方法似乎不是非常面向對象,但你需要提供更多的上下文。這個班可以更新Box a Square或Triangle? – Steve 2014-12-07 13:32:28

+0

它是一個檢測這些對象與玩家之間碰撞的類。現在,我在一個類中有一個函數,它可以檢測所有這些對象之間的碰撞。問題是我必須爲每個對象編寫相同的代碼3次,因爲這些對象不是同一類型,我不能將它全部放入一個代碼中,並請求傳遞一個對象。我希望我解釋它,這真的很難。無論如何,我在尋找的是一個可以作爲參數傳遞的通用對象,我可以參考Square,Triangle或Box,無論我需要什麼。 – 2014-12-07 13:41:25

回答

1

您可以定義使用基類接口你的對象的通用接口。對於你的榜樣,你可以有一個Shape基類:

public abstract class Shape 
{ 
    // Put common methods here, possibly abstract: 
    public abstract double Area(); 
} 

然後定義您的具體形狀,形狀的繼承者:

public class Box : Shape 
{ 
    public double Area() { return _width * _height; } 
} 

// etc. 

然後你可以有你的Update方法採取了外形的參數。現在的參數可以是任何你的類繼承Shape和手段實現是推遲到具體實現,你可以使用任何在這方面上Shape

void Update(Shape shape) 
{ 
} 

定義摘要的方法,所以你需要在具體類中提供實現 - Box類中Area實現的示例 - 但當然,您還可以在基類中定義非抽象方法。

0

是的,使用面向對象編程的基本特徵之一 - 多態性。你的三個類應該從同一個基類繼承。在那個類中實現方法更新。 Polymorphism

0

我不知道您的方案細節,但你可以做這樣的事情:

void Update(Box box = null, Square square = null, Triangle triangle = null) 
{ 
    if(box !=null) 
    { 
     //Do box update 
    } 
    if(square !=null) 
    { 
     //Do square update 
    } 
    if(triangle !=null) 
    { 
     //Do triangle update 
    } 
} 

,你可以,如果你能

Update(square: mysquare); 

反正調用此方法只爲一個或兩個對象操縱你的模型設計,使所有三個類從一個基類繼承,這會更好。