直接上代码,问题写在代码的注释中了
using System; namespace ConsoleApp1 { public interface Sourceable { void method1(); void method2(); } public abstract class Wrapper2 : Sourceable { public void method1() { } public void method2() { } } public class SourceSub1 : Wrapper2 { public new void method1()//用new覆盖了父类的方法 { Console.WriteLine("the sourceable interface's first Sub1!"); } } public class SourceSub2 : Wrapper2 { public new void method2() { Console.WriteLine("the sourceable interface's second Sub2!"); } } class Program { static void Main(string[] args) { Sourceable source1 = new SourceSub1(); Sourceable source2 = new SourceSub2(); source1.method1();//这里为什么调用的是Wrapper2里的方法,而不是SourceSub1里的方法? source1.method2(); source2.method1(); source2.method2(); Console.WriteLine("OK"); Console.Read(); } } }
看到输出的结果中没有调用子类的方法(即使子类覆盖了父类的方法),而是直接调用抽象父类的方法。接口适配器模式讲到,如果一个接口中定义的方法很多,而实现类的时候,又不是所有方法都会用到,那么写一个抽象类去实现接口,方法体为空,然后在具体的子类中实现要使用的方法。。而我这个适配器模式就没有生效了。。
“接口适配器模式讲到”,具体是什么书里讲的,感觉有点怪异。"如果一个接口中定义的方法很多,而实现类的时候,又不是所有方法都会用到"。这样的话本来就应该定义多个接口,这才是正解。
wq你说的对,这种情况已经是接口污染了
如果把 Sourceable source1 = new SourceSub1();
改为 SourceSub1 source1 = new SourceSub1();
就能显示你想要的结果了。
对于这个场景,建议使用 virtual + override
public abstract class Wrapper2 : Sourceable
{
public virtual void method1() { }
public void method2() { }
}
public class SourceSub1 : Wrapper2
{
public override void method1()
{
Console.WriteLine("the sourceable interface's first Sub1!");
}
}
SourceSub1:Wrapper2,Sourceable//同时还要继承自Sourceable才可以,即使父类也继承了
{
}