C Sharp - 需要对象引用的接口

时间:2011-05-20 16:27:12

标签: c# object interface reference

出于某种原因,当我在这个类中调用一个命名空间时,我得到一个错误,指出了这一点 它需要一个对象引用。我认为使用IMethodResponses类型的引用变量将允许我在自己的创建中访问方法,但 我无法做到这一点,也不能简单地在没有引用的情况下实现接口并使用它的方法......

有人可以帮我解决这个问题吗?我会发布界面本身,以防他们的错误。我应该注意到,我没有这么做。

//类实现接口:

internal sealed class Name : INameCreation, IMethodResponses
{
    public ScratchCreate create = ScratchCreate.create;
    ListCreate select = new ListCreate();
    public IMethodResponses _responses = IMethodResponses; //<--Error

    public static void ChooseName()
    {
        int response;

        Console.WriteLine("Press \'1\' to select from a list of names, or \'2\' to create your own.");
        Console.WriteLine("If you wish to quit, you may do so by pressing \'0\'");
        response = int.Parse(Console.ReadLine());

        do
        {
            Console.WriteLine("Sorry, you didn't enter any of the correct responses...");
            Console.WriteLine("Press \'1\' to select from a list of names, or \'2\' to create your own.");
            Console.WriteLine("If you wish to quit, you may do so by pressing \'0\'");
            response = int.Parse(Console.ReadLine());
        }
        while (response != 0 || response != 1 || response != 2);

        _responses.IntegerResponse(response);

    }

    public void IntegerResponse(int response)
    {
        switch (response)
        {
            case 0:
                Console.WriteLine("Goodbye!");
                break;
            case 1:

                break;
            case 2:

                break;

        }
    }

//接口:

namespace PlayerCreation
 {
     public interface INameCreation
     { 

     }
     public interface IMethodResponses 
     {
        void IntegerResponse(int response);
        void StringResponse(string response);
     } 
 }

2 个答案:

答案 0 :(得分:1)

您正在使用类型分配IMethodResponses类型的引用变量,而不是类型的实例。

要解决此问题,您只需执行以下操作:

public Name()
{
    _responses = (IMethodResponses)this;
}

编辑:我刚注意到,您的代码还有两个问题: 1. _responses是非静态的,您在静态类中访问此变量,这将无效。 2. StringResponses尚未实现。

如果你想将ChooseName维护为静态并且可以访问同一个实例,那么你必须实现一个单例。

答案 1 :(得分:0)

如果您将IntegerResponse方法设为静态,则可以使用以下命令调用它:

Name.IntegerResponse(...);

有关:

public IMethodResponses _responses = IMethodResponses;

从静态方法中,您只能访问静态成员。 将类型设置为相同类型的变量将不起作用。 预期适合_responses的是其类型的任何类的实例或实现其接口的任何类( IMethodResponses )。因为你不能创建接口的实例而不是后者。

public static IMethodResponses _responses = new Name();

这可以工作但不需要,因为在方法定义之前使用static关键字可以安全地使IntegerResponse成为静态。

使用public static void ChooseName()有点尴尬。此方法是静态的,不返回任何内容。它只使用Console.Writeline。你会发现,一旦你开始开发一个真正的应用程序,这将需要重做。