Я хочу использовать интерфейс, который реализуется другим классом, для вызова функции без создания экземпляра указанного класса в c # - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу вызвать все функции, используя метод интерфейса, но я не хочу делать экземпляр класса, который реализует интерфейс.В прошлом я делал несколько проектов, где делал ISomeInterface proxy = ChannelFactory<SomeImplementation>().CreateChannel(), а затем использовал такие методы интерфейса, как proxy.Method().Я хочу сделать что-то подобное, возможно, без ChannleFactory, если возможно, и мне интересно, если это возможно.

private static IUserInterface proxy;
        [STAThread]
        static void Main(string[] args)
        {
            bool closeApp = false;

            do
            {
                proxy.PrintMenu();

                int command;
                Int32.TryParse(Console.ReadKey().KeyChar.ToString(), out command);
                Console.WriteLine();
                closeApp = proxy.SendMenuCommand(command);
            } while (!closeApp);

            // Aplikacija ugasena
            Console.WriteLine("Application closed successfully. Press any key...");
            Console.ReadKey();
        }

Появляется ошибка, что прокси не установлен на экземпляробъект.

1 Ответ

4 голосов
/ 20 апреля 2019

Интерфейс - это просто контракт, он не имеет ничего общего с экземпляром. Если класс реализует интерфейс, вы можете типизировать экземпляр к этому интерфейсу и вызвать методы / свойства, определенные в интерфейсе. (это даже не прокси)

Интерфейс не содержит никакой реализации. Это просто набор соглашений, которые класс должен реализовать, чтобы придерживаться контракта.

Итак, у вас должен быть экземпляр.

В вашем примере: proxy.PrintMenu(); кто реализовал PrintMenu()?

Я мог бы быть что-то вроде:

Интерфейс:

// This is the contract. (as you can see, no implementation)
public interface IUserInterface
{
    void PrintMenu();
    bool SendMenuCommand(int command);
}

Первая реализация:

// The class implements that interface, which it MUST implements the methods.
// defined in the interface.  (except abstract classes)
public class MyUserInterface : IUserInterface
{
    public void PrintMenu()
    {
        Console.WriteLine("1 - Option one");
        Console.WriteLine("2 - Option two");
        Console.WriteLine("3 - Option three");
    }

    public bool SendMenuCommand(int command)
    {
        // do something.
        return false;
    }
}

Другая реализация:

// same for this class.
public class MyOtherUserInterface : IUserInterface
{
    public void PrintMenu()
    {
        Console.WriteLine("1) Submenu 1");
        Console.WriteLine("2) Submenu 2");
        Console.WriteLine("3) Submenu 3");
    }

    public bool SendMenuCommand(int command)
    {
        // do something.
        return true;
    }
}

Ваш главный:

private static IUserInterface menu;

[STAThread]
static void Main(string[] args)
{
    bool closeApp = false;

    // because the both classes implements the IUserInterface interface,
    // the both can be typecast to IUserInterface 
    IUserInterface menu = new MyUserInterface();

    // OR
    //IUserInterface menu = new MyOtherUserInterface();

    do
    {
        proxy.PrintMenu();

        int command;
        Int32.TryParse(Console.ReadKey().KeyChar.ToString(), out command);
        Console.WriteLine();
        closeApp = proxy.SendMenuCommand(command);
    } while (!closeApp);

    // Aplikacija ugasena
    Console.WriteLine("Application closed successfully. Press any key...");
    Console.ReadKey();
}
...