问题
If I have a default interface method like this:
public interface IGreeter
{
void SayHello(string name) => System.Console.WriteLine($"Hello {name}!");
}
Can I have my concrete implementation call that default method?
public class HappyGreeter : IGreeter
{
public void SayHello(string name)
{
// what can I put here to call the default method?
System.Console.WriteLine("I hope you're doing great!!");
}
}
So that calling:
var greeter = new HappyGreeter() as IGreeter;
greeter.SayHello("Pippy");
Results in this:
// Hello Pippy!
// I hope you're doing great!!
Indeed Calling C# interface default method from implementing class shows that I can call method that my class does not implement, but as somewhat expected adding call to ((IGreeter)this).SayHello(name);
inside HappyGreeter.SaysHello
causes stack overflow.
回答1:
As far as I know you can't invoke default interface method implementation in inheriting class (though there were proposals). But you can call it from inheriting interface:
public class HappyGreeter : IGreeter
{
private interface IWorkAround : IGreeter
{
public void SayHello(string name)
{
(this as IGreeter).SayHello(name);
System.Console.WriteLine("I hope you're doing great!!");
}
}
private class WorkAround : IWorkAround {}
public void SayHello(string name)
{
((IWorkAround)new WorkAround()).SayHello(name);
}
}
UPD
In my original answer too much wanted to show that you can call base
in inheriting interface, but as @Alexei Levenkov suggested in comments cleaner way in this particular case would be something like this:
public class HappyGreeter : IGreeter
{
private class WorkAround : IGreeter { }
private static readonly IGreeter _workAround = new WorkAround();
public void SayHello(string name)
{
_workAround.SayHello(name);
System.Console.WriteLine("I hope you're doing great!!");
}
}
回答2:
I know that this is not an answer to the question, but the next approach also can be used to emulate base
functionality:
public interface IGreeter
{
void SayHello(string name) => BaseSayHello(name);
// This static method can be used in implementers of "IGreeter"
// to emulate "base" functionality.
protected static void BaseSayHello(string name) => System.Console.WriteLine($"Hello {name}!");
}
public class HappyGreeter : IGreeter
{
public void SayHello(string name)
{
IGreeter.BaseSayHello(name);
Console.WriteLine("I hope you're doing great!!");
}
}
来源:https://stackoverflow.com/questions/62334232/can-a-c-sharp-class-call-an-interfaces-default-interface-method-from-its-own-im