我想使用另一个 class 正在实现的接口来调用一个函数,而无需在 c# 中创建所述 class 的实例
I want to use an interface that is being implemented by another class to call a function without making an instance of said class in c#
我想使用接口方法调用所有函数,但我不想创建实现该接口的 class 的实例。我过去做了一些项目,我做了 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();
}
弹出的错误是proxy没有设置为对象的实例
接口只是一个契约,与实例无关。如果 class 实现了该接口,您可以将实例类型转换为该接口并调用接口中定义的 methods/properties .. (它甚至不是代理)
接口不包含任何实现。这只是 class 必须执行以遵守合同的一组协议。
所以你必须有一个实例。
在您的示例中: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();
}
我想使用接口方法调用所有函数,但我不想创建实现该接口的 class 的实例。我过去做了一些项目,我做了 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();
}
弹出的错误是proxy没有设置为对象的实例
接口只是一个契约,与实例无关。如果 class 实现了该接口,您可以将实例类型转换为该接口并调用接口中定义的 methods/properties .. (它甚至不是代理)
接口不包含任何实现。这只是 class 必须执行以遵守合同的一组协议。
所以你必须有一个实例。
在您的示例中: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();
}