C#设计模式-派生类实现非虚接口陷阱的实例代码分享


本文摘自PHP中文网,作者黄舟,侵删。

理解接口方法和虚方法的区别

  第一眼看来,实现接口和覆写虚方法似乎没有什么区别,实际上,实现接口和覆写虚方法之间的差别很大!!!

派生不能覆写接口的非虚成员

  接口中声明的成员方法默认情况下并非虚方法,所以,派生类不能覆写基类中实现接口的非虚成员。
看一个例子。
定义接口ITest:

1

2

3

public interface ITest

{        void Test();

}

实现接口的Base类和Derive类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public class Base:ITest

{        public Base()

    {

        Console.WriteLine("This is base constructor");

    }        //实现ITest接口

    public void Test()

    {

        Console.WriteLine("This is in base to ITest implement");

    }

}    public class Derive :Base,ITest

{        public Derive()

    {

        Console.WriteLine("This is derived constructor");

 

    }        //测试Derive类实现了ITest吗??

    public void Test()

    {

        Console.WriteLine("This is in Derive to ITest implement");

    }

}

调用对象Base和Derive:

1

2

3

4

5

6

Base b = new Base();

b.Test();

 

Base d = new Derive();//将d声明为Base对象

d.Test();

Console.ReadLine();

输出结果为:


这里写图片描述

  可以看出,b和d实例的Test方法实现的行为都是位于基类的!!!这表明了,派生类不能覆写基类中实现接口的成员(非虚方法)

但是,请看下面调用:

1

2

3

4

5

Base b = new Base();

b.Test();

Derive d = new Derive(); //将d声明为Derive对象

d.Test();

Console.ReadLine();

输出结果为:


这里写图片描述

因此,如果想要继承的对象调用接口实现方法,只能声明为Derive实例。这样做不符合Effective C#中变量都声明为基实例的原则!!!

派生类方法个性,将基类方法转为虚方法

  避免这种使用上的混淆,如果确实派生类实现方法是个性行为,那么需要将基类的实现接口的方法前加virtual修饰符!
代码修改如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Base:ITest

    {        public Base()

        {

            Console.WriteLine("This is base constructor");

        }        public virtual void Test() //实现ITest接口的虚方法

        {

            Console.WriteLine("This is in base to ITest implemnt");

        }

    }    public class Derive :Base,ITest

    {        public Derive()

        {

            Console.WriteLine("This is derived constructor");

 

        }         public override void Test() //实现接口ITest的复写方法

        {

            Console.WriteLine("This is in Derive to ITest implemnt");

        }

    }

一次实现,多个关联对象使用

  观察上面的代码,我们发现,在基类中实现的接口,如果派生类也想实现此接口,那么它默认继承了基类的接口实现,所以不用重复写代码实现接口。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public interface ITest

 {        void Test();

 }    public class Base:ITest

 {        public Base()

     {

         Console.WriteLine("This is base constructor");

     }        public void Test()

     {

         Console.WriteLine("This is in base to ITest implemnt");

     }

 }    public class Derive :Base,ITest

 {        public Derive()

     {

         Console.WriteLine("This is derived constructor");

 

     }

 }

总结:
1、 派生不能覆写接口的非虚成员;
2、如果派生类方法是个性方法,将基类方法转为虚方法;
3、若基类实现了接口方法,将派生类也显示地继承此接口,但是不用再次实现了!!!

以上就是C#设计模式-派生类实现非虚接口陷阱的实例代码分享的详细内容!

相关阅读 >>

C#执行原理深入解析(图文)

详细介绍用C#描述数据结构2:array的图文代码实例

C# 获取随机字符串实现方法

C# 中虚方法和抽象方法

史上最佳的C#编程书籍推荐

新手学习.net编程计划-1

C#获取本机ip搜集整理7种方法的示例代码分享

C#描述数据结构1:统计代码执行时间对象的代码详解

简述C#中builder和buffer类的用法详解

C# 应用npoi获取excel中的图片,保存至本地的算法的图文代码实例详解

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...