C Sharp - интерфейсы, которые требуют ссылки на объект - PullRequest
1 голос
/ 20 мая 2011

По какой-то причине, когда я вызываю пространство имен в этом классе, я получаю сообщение об ошибке, в котором говорится, что это требует ссылки на объект. Я думал, что использование ссылочной переменной типа 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 ]

1 голос
/ 20 мая 2011

Вы присваиваете ссылочную переменную типа IMethodResponses с типом, а не экземпляром типа.

Чтобы это исправить, вы можете просто сделать следующее:

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

Edit: Также я только что заметил, есть две другие проблемы с вашим кодом: 1. _responses не является статическим, и вы обращаетесь к этой переменной в статическом классе, который не будет работать. 2. StringResponses не был реализован.

Если вы хотите сохранить ChooseName как статическое и иметь доступ к одному и тому же экземпляру, вам придется реализовать singleton.

0 голосов
/ 20 мая 2011

Если вы сделаете ваш метод IntegerResponse статическим, вы можете вызвать его с помощью:

Name.IntegerResponse(...);

Для:

public IMethodResponses _responses = IMethodResponses;

Из статического метода вы можете получить доступ только к статическим элементам. Установка типа в переменную того же типа не будет работать. Предполагается, что вписывается в _responses * экземпляр любого класса его типа или любого класса, реализующего его интерфейс ( IMethodResponses ). Поскольку вы не можете создать экземпляр интерфейса, это не последний.

public static IMethodResponses _responses = new Name();

Это будет работать, но не нужно, поскольку IntegerResponse можно безопасно сделать статическим, используя ключевое слово static перед определением метода.

Что немного неловко, так это использование public static void ChooseName(). Этот метод является статическим и ничего не возвращает. Он просто использует Console.Writeline. Вы обнаружите, что как только вы начнете разрабатывать настоящее приложение, его нужно будет переделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...