繁体   English   中英

如何直接从 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 显式实现ISample.SampleMethod,这不是您想要的。 只需将其更改为

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

为什么不使用这个

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

public interface ISample
{
    public abstract void SampleMethod();
}

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

或者如果有 c# 8+ 你可以试试这个

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

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

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

但该接口的工作方式与抽象 class 几乎相同

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

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

您必须知道,在实现接口的成员时,有两种方法:

  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();
            ((ISample)smpcls).SampleMethod();

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

两种方法的 output 如下:

//class method
//interface method

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM