Original link: Default Interface Implementations in C#: Where Inheritance Goes to Troll You / Dev.
The author is right. And I am baffled. My example code is sligtly different than his.
namespace IFDef
{
public interface IX
{
public void M()
{
Console.WriteLine("IX");
}
}
public class X : IX
{
public void M()
{
Console.WriteLine("X");
}
}
public interface IY
{
public void M()
{
Console.WriteLine("IY");
}
}
public class YBase : IY
{
}
public class Y : YBase
{
public void M()
{
Console.WriteLine("Y");
}
}
public interface IZ
{
public void M()
{
Console.WriteLine("IZ");
}
}
public class ZBase : IZ
{
}
public class Z : ZBase, IZ
{
public void M()
{
Console.WriteLine("Z");
}
}
public class Program
{
public static void Main(string[] args)
{
IX ox = new X();
ox.M();
IY oy = new Y();
oy.M();
IZ oz = new Z();
oz.M();
}
}
}
Output:
X IY Z
Java does it right.
public class IFDef {
public static interface IX
{
public default void m() {
System.out.println("IX");
}
}
public static class X implements IX {
public void m() {
System.out.println("X");
}
}
public static interface IY
{
public default void m() {
System.out.println("IY");
}
}
public static class YBase implements IY {
}
public static class Y extends YBase {
public void m() {
System.out.println("Y");
}
}
public static interface IZ
{
public default void m() {
System.out.println("IZ");
}
}
public static class ZBase implements IZ {
}
public static class Z extends ZBase implements IZ {
public void m() {
System.out.println("Z");
}
}
public static void main(String[] args) {
IX ox = new X();
ox.m();
IY oy = new Y();
oy.m();
IZ oz = new Z();
oz.m();
}
}
Output:
X Y Z