Интерфейс - это просто контракт, он не имеет ничего общего с экземпляром. Если класс реализует интерфейс, вы можете типизировать экземпляр к этому интерфейсу и вызвать методы / свойства, определенные в интерфейсе. (это даже не прокси)
Интерфейс не содержит никакой реализации. Это просто набор соглашений, которые класс должен реализовать, чтобы придерживаться контракта.
Итак, у вас должен быть экземпляр.
В вашем примере: 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();
}