如何直接从 class 调用从接口继承的方法?

How can I call a method inherited from an interface directly from a class?

using System;

interface ISample{
  abstract void SampleMethod();
}

class SampleClass: ISample{
  void ISample.SampleMethod(){
    Console.WriteLine("SampleMethod was called.");
  }
}

class Program{
  public static void Main (string[] args){
    SampleClass smpcls = new SampleClass();
    smpcls.ISample.SampleMethod();
  }
}

这段代码可以无缝运行。但我必须从“SampleClass”的实例“smpcls”调用“ISample”接口。如何直接从“SampleClass”实例调用“SampleMethod”?

例如:

...
SampleClass smpcls = new SampleClass();
smpcls.SampleMethod() //I would like to call it like this.
smpcls.ISample.SampleMethod() //Not like this
...

SampleClass explicitly implements ISample.SampleMethod,这不是你想要的。只需将其更改为

class SampleClass: ISample{
  void SampleMethod(){
    Console.WriteLine("SampleMethod was called.");
  }
}

您必须将其转换为接口才能访问显式实现的接口方法

ISample smpcls = new SampleClass();
smpcls.SampleMethod();

为什么不用这个

void Main()
{
    SampleClass smpcls = new SampleClass();
    smpcls.SampleMethod();
}

public interface ISample
{
    public void SampleMethod();
}

public class SampleClass : ISample
{
    public void SampleMethod()
    {
        Console.WriteLine("SampleMethod was called.");
    }
}

或者如果有 c# 8+,也许你的意思是这个

SampleClass smpcls = new SampleClass();
smpcls.AsISampleMethod();

//or if you don't want to create an extra method

smpcls.AsISample.SampleMethod();


public interface ISample
{
    void SampleMethod()
    {
        Console.WriteLine("SampleMethod was called.");
    }
}
public class SampleClass : ISample
{
    public ISample AsISample => (ISample)this;

    public void AsISampleMethod()
    {
        AsISample.SampleMethod();
    }
}

但接口的工作原理几乎与抽象相同class

你要知道,实现一个接口的成员有两种方式:

  1. 实现接口

  2. 显式实现接口

在您的示例中,您选择了显式实现接口

void ISample.SampleMethod()

如果您使用此选项,那么您是在告诉 class 方法 void ISample.SampleMethod() 属于接口而不属于class.

为什么以及什么时候可以使用显式选项?好吧,假设你的 class 中有另一个方法,它被称为 SampleMethod() 现在,如果您实现 ISample,那么您将与此方法发生冲突,因为 ISample 包含一个具有相同名称的方法。因此,要解决这个问题,您可以在接口方法上使用显式选项。

public class SampleClass : ISample
{
    void ISample.SampleMethod()
    {
        Console.WriteLine("interface method");
    }

    public void SampleMethod()
    {
        Console.WriteLine("class method");
    }
}

在您的调用代码中,这是调用每个方法的方式:

           SampleClass smpcls = new SampleClass();
           smpcls.SampleMethod();
           ((ISample)smpcls).SampleMethod();

如您所见:((ISample)smpcls).SampleMethod(); 这属于接口,因为您必须将其转换为它。

两种方法的输出如下:

//class method
//interface method

如果您没有冲突方法,则使用选项“实现接口”,这将声明没有接口名称的代码:

public class SampleClass : ISample
{
    public void SampleMethod()
    {
        Console.WriteLine("now this method belongs to the class");
    }
}