在学习接口适配器的时候遇到点小问题。。特来求助

2019-03-06 11:56发布

问题:

直接上代码,问题写在代码的注释中了

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();
        }
    }
}

看到输出的结果中没有调用子类的方法(即使子类覆盖了父类的方法),而是直接调用抽象父类的方法。接口适配器模式讲到,如果一个接口中定义的方法很多,而实现类的时候,又不是所有方法都会用到,那么写一个抽象类去实现接口,方法体为空,然后在具体的子类中实现要使用的方法。。而我这个适配器模式就没有生效了。。

回答1:

“接口适配器模式讲到”,具体是什么书里讲的,感觉有点怪异。"如果一个接口中定义的方法很多,而实现类的时候,又不是所有方法都会用到"。这样的话本来就应该定义多个接口,这才是正解。



回答2:

如果把 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!");
    }
}


回答3:

SourceSub1:Wrapper2,Sourceable//同时还要继承自Sourceable才可以,即使父类也继承了

{

}