2014-04-23 103 views
-1

我在Unity項目中第一次使用接口。我試圖讓這個clas實現Move()方法。應該很容易,但它不工作。我已經嘗試了所有的微軟網頁和一些類似的問題,但還沒有找到同樣的問題。實現接口方法的問題

using UnityEngine; 
using System.Collections; 

public interface IMover { 

    float Move(); 

} 

public class Move_1 : Mover { 

public float moveSpeed = 1; 
public float energyConsumption = 0.1; 

float Move(Vector2 vec,Rigidbody2D rb){ 
    rb.AddForce (vec * moveSpeed); 
    return energyConsumption * vec.magnitude; 
} 

} 

我敢肯定,我已經錯過了一些東西明顯。我試過IMover.Move()之類的東西

public float Mover(

,但沒有什麼工作。另一方面,我對帶接口的可見性修飾符有點困惑。接口沒有可見性修飾符,所以我認爲它是實現的一部分。我可能會混淆隱式和顯式聲明。

+0

嘗試Move_1:IMover而不是Move_1:捷運 –

+0

方法的簽名必須是在接口和實現類相同。其次,除非你使用顯式接口實現('float IMover.Move(){...}'),否則方法*具有*爲'public'。相反,如果你使用明確的實現,它必須是「私有」的。接口成員不需要可訪問性修飾符,因爲唯一真正有意義的是「public」。如果你想限制可訪問性,你必須將它應用到整個界面。 – Luaan

回答

1

你的接口定義了一個方法

public interface IMover 
{ 
    float Move(); 
} 

這意味着實現此接口的類必須有一個公共的方法不帶參數稱爲移動和返回float

public class SomeClass : IMover 
{ 
    public float Move() 
    { 
     // some code 
     return someFloat; 
    } 
} 

你的班級爲你擁有了它沒有實現接口,但這可能是一個錯字。

您可以愉快地在類中創建一個方法重載,但你也必須已經在接口中定義的簽名,以便以下是有效的

public class SomeClass : IMover 
{ 
    public float Move() { /* implement */ } 

    public float Move(float f) { /* implement */ } 
} 

但是以下(這是類似的情況而定)是無效的,因爲它不具備該接口IMover

public class SomeClass : IMover 
{ 
    public float Move(float f) { /* implement */ } 
} 

按您的評論的合同定義的方法,你需要什麼做的是這樣修改你的界面:

public interface IMover 
{ 
    float Move(Vector2 vec, Rigidbody2D rb); 
} 

並確保你的方法在你的類中聲明爲public。

+0

是的,這是一個錯字,但這不是問題。我計劃讓每個移動方法都採用浮動和剛體。我可以更改界面來反映這一點嗎? '公共接口IMover {0} {0} {0} {0}移動(Vector2 vec,Rigidbody2D rb); }'這會解決我的問題嗎?它顯然還沒有實施。 – pseudoabdul

+0

@pseudoabdul新增了答案。 –

1

這是你想要做的嗎?

using UnityEngine; 
using System.Collections; 

public interface IMover { 

    float Move(); 

} 

public class Move_1 : IMover { 

    private Vector2 vec; 
    private Rigidbody2D rb; 

    public float moveSpeed = 1; 
    public float energyConsumption = 0.1; 

    public Move_1(Vector2 vec,Rigidbody2D rb){ 
     this.vec = vec; 
     this.rb = rb; 
    } 

    float Move(){ 
     this.rb.AddForce (this.vec * moveSpeed); 
     return energyConsumption * vec.magnitude; 
    } 

} 
+0

這是什麼構造函數?我真的不明白,對不起。 – pseudoabdul

+0

你的接口沒有參數,所以你不能將參數傳遞給類的方法。在實現接口的方法時,您必須遵守原始方法的簽名。由於您的「移動」功能需要vec和rb參數,因此我將它們放入構造函數中。 – caspian