1

据我所知,我需要将继承类的实例向上转换到实现所需方法的接口,然后调用它。

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();
}

如果我需要的具有不同方法的默认实现的接口很少怎么办?是否有一些模式可以解决这个问题,或者我应该总是使用关键字来调用某个接口的方法?

4

3 回答 3

3

除了@DavGarcia的答案之外的另一个选择 - 引入一个结合所需接口并向上转换的接口:

interface IExample : IProcess, IWait { }    
class Example : IExample { }

IExample item = new Example();
item.Do();
item.Wait();
于 2021-01-25T22:40:53.643 回答
1

如果你只调用一次该方法,我会像下面那样做。尽管丑陋,但它是正确的。

((IProcess)item).Do();

如果您需要多次调用,还有一些其他选项可能更简洁。可以转换成界面:

IProcess itemProcess = item;
itemProcess.Do(); // Now call many times.

通常,我认为您会将对象传递给需要接口的函数:

void DoSomething(IProcess itemProcess) {
    itemProcess.Do();
}

DoSomething(item);
于 2021-01-25T22:30:08.083 回答
1

您可以覆盖实现类中的方法并将控制权传递给默认实现。

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();
}
于 2021-01-25T23:25:31.577 回答