none
C# 虚函数返回类型问题 RRS feed

  • 问题

  • 基类中 public abstract Item Copy();
    子类中 public override Dir Copy() { ... }
    就编译不过了,说什么返回类型必须匹配基类的那个。Dir 不也是 Item 嘛!

    2013年2月26日 15:25

答案

  • 方法签名明显不一致嘛


    Please mark this as answer if it helps with this issue!

    Dir 是 Item 的子类嘛,怎么就不一致了?现有这需求咋办?

    箪食瓢饮随遇安,不求栋梁求参天。


    你还用Item就好了,调用时候返回结果在强类型转换为Dir即可。

    family as water

    2013年2月27日 1:44
  • 基类中 public abstract Item Copy();
    子类中 public override Dir Copy() { ... }
    就编译不过了,说什么返回类型必须匹配基类的那个。Dir 不也是 Item 嘛!

    一种设计思路:

        abstract class ParentClass { public abstract dynamic Copy(); }
        class ChildClass : ParentClass
        {
            public override dynamic Copy()
            { 
                return new Item();
            }
        }
        class Item { }
        class Dir : Item { }
    
            static void Main(string[] args)
            {
                ChildClass childClass = new ChildClass();
                Item item = childClass.Copy();
            }

    2013年3月1日 5:53
  • hi

    基类可以出现的地方,一定可以用子类替换,子类出现的地方不一定能用父类替换,你得先了解Dir与Item的关系,只要明白替换原则应该就能解你的疑惑

    http://blog.csdn.net/brookes/article/details/1896758

    http://www.uml.org.cn/mxdx/201112191.asp

    http://baike.baidu.com/view/1688346.htm


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月1日 6:22
  • FreeBuilder,

    你说的对,我承认Dir是Item的子类(假设你定义了)。但是语法上规定实现子类实现抽象类的方法,必须和抽象类保持完全一致(如果不一致,怎么叫“重写”?那就变成重定义一个方法了)。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月2日 4:53
    版主

全部回复

  • 方法签名明显不一致嘛

    Please mark this as answer if it helps with this issue!

    2013年2月26日 15:34
  • 方法签名明显不一致嘛

    Please mark this as answer if it helps with this issue!

    Dir 是 Item 的子类嘛,怎么就不一致了?现有这需求咋办?

    箪食瓢饮随遇安,不求栋梁求参天。

    2013年2月26日 15:43
  • 方法签名明显不一致嘛


    Please mark this as answer if it helps with this issue!

    Dir 是 Item 的子类嘛,怎么就不一致了?现有这需求咋办?

    箪食瓢饮随遇安,不求栋梁求参天。


    你还用Item就好了,调用时候返回结果在强类型转换为Dir即可。

    family as water

    2013年2月27日 1:44
  • 基类中 public abstract Item Copy();
    子类中 public override Dir Copy() { ... }
    就编译不过了,说什么返回类型必须匹配基类的那个。Dir 不也是 Item 嘛!

    一种设计思路:

        abstract class ParentClass { public abstract dynamic Copy(); }
        class ChildClass : ParentClass
        {
            public override dynamic Copy()
            { 
                return new Item();
            }
        }
        class Item { }
        class Dir : Item { }
    
            static void Main(string[] args)
            {
                ChildClass childClass = new ChildClass();
                Item item = childClass.Copy();
            }

    2013年3月1日 5:53
  • hi

    基类可以出现的地方,一定可以用子类替换,子类出现的地方不一定能用父类替换,你得先了解Dir与Item的关系,只要明白替换原则应该就能解你的疑惑

    http://blog.csdn.net/brookes/article/details/1896758

    http://www.uml.org.cn/mxdx/201112191.asp

    http://baike.baidu.com/view/1688346.htm


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月1日 6:22
  • FreeBuilder,

    你说的对,我承认Dir是Item的子类(假设你定义了)。但是语法上规定实现子类实现抽象类的方法,必须和抽象类保持完全一致(如果不一致,怎么叫“重写”?那就变成重定义一个方法了)。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月2日 4:53
    版主