![](/img/trans.png)
[英]When using generic types, how can I call an method from an inherited class instead of a base 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();
您必须知道,在实现接口的成员时,有两种方法:
实现接口
显式实现接口
在您的示例中,您明确选择了实现接口。
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.