我们如何使用不同接口的默认实现?
How can we use default implementation of different interfaces?
据我所知,我需要将继承的 class 的实例向上转换为实现所需方法的接口,然后调用它。
interface IProcess
{
void Do() { Console.WriteLine("doing"); }
//...
}
interface IWait
{
void Wait() { Console.WriteLine("waiting"); }
//...
}
class Example : IProcess, IWait { }
static void Main(string[] args)
{
Example item = new Example();
(item as IProcess).Do();
(item as IWait).Wait();
}
如果我需要的默认实现不同方法的接口很少怎么办?有没有一些模式可以解决这个问题,或者我应该总是使用 as 关键字来调用某个接口的方法?
如果你只调用一次方法,我会像下面那样做。再丑也是对的
((IProcess)item).Do();
如果您需要多次调用,还有一些其他选项可能更简洁。可以转换为界面:
IProcess itemProcess = item;
itemProcess.Do(); // Now call many times.
但通常情况下,我认为您会将对象传递给需要接口的函数:
void DoSomething(IProcess itemProcess) {
itemProcess.Do();
}
DoSomething(item);
除了 @DavGarcia 的答案之外的另一个选项 - 引入一个接口组合所需的接口并向上转换:
interface IExample : IProcess, IWait { }
class Example : IExample { }
IExample item = new Example();
item.Do();
item.Wait();
您可以覆盖实现中的方法 class 并将控制传递给默认实现。
interface IProcess
{
void Do() { Console.WriteLine("doing"); }
}
interface IWait
{
void Wait() { Console.WriteLine("waiting"); }
}
class Example : IProcess, IWait
{
public void Do() => ((IProcess)this).Do();
public void Wait() => ((IWait)this).Wait();
}
现在您可以这样做了:
static void Main(string[] args)
{
Example item = new Example();
item.Do();
item.Wait();
}
据我所知,我需要将继承的 class 的实例向上转换为实现所需方法的接口,然后调用它。
interface IProcess
{
void Do() { Console.WriteLine("doing"); }
//...
}
interface IWait
{
void Wait() { Console.WriteLine("waiting"); }
//...
}
class Example : IProcess, IWait { }
static void Main(string[] args)
{
Example item = new Example();
(item as IProcess).Do();
(item as IWait).Wait();
}
如果我需要的默认实现不同方法的接口很少怎么办?有没有一些模式可以解决这个问题,或者我应该总是使用 as 关键字来调用某个接口的方法?
如果你只调用一次方法,我会像下面那样做。再丑也是对的
((IProcess)item).Do();
如果您需要多次调用,还有一些其他选项可能更简洁。可以转换为界面:
IProcess itemProcess = item;
itemProcess.Do(); // Now call many times.
但通常情况下,我认为您会将对象传递给需要接口的函数:
void DoSomething(IProcess itemProcess) {
itemProcess.Do();
}
DoSomething(item);
除了 @DavGarcia 的答案之外的另一个选项 - 引入一个接口组合所需的接口并向上转换:
interface IExample : IProcess, IWait { }
class Example : IExample { }
IExample item = new Example();
item.Do();
item.Wait();
您可以覆盖实现中的方法 class 并将控制传递给默认实现。
interface IProcess
{
void Do() { Console.WriteLine("doing"); }
}
interface IWait
{
void Wait() { Console.WriteLine("waiting"); }
}
class Example : IProcess, IWait
{
public void Do() => ((IProcess)this).Do();
public void Wait() => ((IWait)this).Wait();
}
现在您可以这样做了:
static void Main(string[] args)
{
Example item = new Example();
item.Do();
item.Wait();
}