首页 新闻 会员 周边

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

0
悬赏园豆:10 [已解决问题] 解决于 2019-03-06 12:17

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

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

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

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2019-03-03 12:45
< >
分享
最佳答案
0

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

收获园豆:8
会长 | 专家六级 |园豆:12401 | 2019-03-03 13:34

wq你说的对,这种情况已经是接口污染了

hexllo | 园豆:318 (菜鸟二级) | 2019-03-06 12:17
其他回答(2)
0

如果把 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!");
    }
}
收获园豆:2
dudu | 园豆:31003 (高人七级) | 2019-03-03 13:35
0

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

{

}

hexllo | 园豆:318 (菜鸟二级) | 2019-03-06 12:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册