实现接口方法的问题

时间:2014-04-23 13:25:40

标签: c# interface

我在Unity项目中第一次使用接口。我试图让这些clas实现Move()方法。应该很容易,但它不起作用。我已经尝试了所有的Microsoft页面和一些类似的问题,但没有找到相同的问题。

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(

但没有任何效果。不是一边,我对带接口的可见性修饰符有点困惑。接口没有可见性修饰符,所以我认为它将是实现的一部分。我可能会混淆隐式和显式声明。

2 个答案:

答案 0 :(得分:1)

您的界面定义了一种方法

public interface IMover
{
    float Move();
}

这意味着实现此接口的任何类都必须具有名为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);
}

并确保您在班级中将该方法声明为公开。

答案 1 :(得分: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;
    }

}