2014-04-23 106 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