如何直接从 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
你要知道,实现一个接口的成员有两种方式:
实现接口
显式实现接口
在您的示例中,您选择了显式实现接口。
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");
}
}
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
你要知道,实现一个接口的成员有两种方式:
实现接口
显式实现接口
在您的示例中,您选择了显式实现接口。
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");
}
}