父类和子类的转换

dongqingtree 2015-05-27 09:00:43
看下面的例子,在调用 Dog d = d1.Mating(d2); 时系统报错,
那如何才能使父类中Mating的返回值根据子类的变化而变化呢?
难得必须在Cat和Dog下分别实现一个Mating?
求解答
    public class Animal
{
public Animal Mating(Animal a)
{
return new Animal();
}
}

public class Cat : Animal
{
}

public class Dog : Animal
{
}

class Program
{
static void Main(string[] args)
{
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog d = d1.Mating(d2);
}
}

...全文
245 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongqingtree 2015-06-02
  • 打赏
  • 举报
回复
引用 10 楼 effun 的回复:

    public class Animal
    {
        public Animal Mating(Animal a)
        {
            return (Animal)Activator.CreateInstance(this.GetType());
        }
    }
 
    public class Cat : Animal
    {
        public new Cat Mating(Animal a)
        {
            if (!(a is Cat))
               throw new ArgumentExceiption();
            return (Cat)base.Mating(cat);
        }
    }
 
    public class Dog : Animal
    {
        public Dog Mating(Dog dog)
        {
            return (Dog)base.Mating(dog);
        }
    }
以上代码用两种方式实现你的需求
谢谢,但实际上还是需要在每个子类中重写一下这个父类的函数
dongqingtree 2015-05-28
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
你说“狗是动物”,那么别人都理解你。如果你说“动物都是狗”,那么别人就以为你一定是被狗吓坏了、有了后遗症的结果。所以这是最基本的逻辑,任何一个真正的OOPL都会拒绝编译和执行后者的逻辑的。
既然都有Dog做主体了,调用Mating后的能是个Cat吗?如果能识别主体是什么类型,那返回一样的类型不就可以了吗?
dongqingtree 2015-05-28
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
Dog d = d1.Mating(d2);
这种代码毫无道理。任何一个强类型的OOPL语言都不允许这种引用。
你能明白我说的问题吗?谁都知道直接那样用有错误 既然引用Mating函数时,使用的是Dog类,怎样才能根据参数的类型变动Animal中的返回值呢?
dongqingtree 2015-05-28
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
public abstract class Animal
        {
            public abstract string Name { get; }
            public T Mating<T>(T a)
                where T : Animal, new()
            {
                return new T();
            }
        }

        public class Cat : Animal
        {
            public override string Name
            {
                get { return "Cat"; }
            }
        }

        public class Dog : Animal
        {
            public override string Name
            {
                get { return "Dog"; }
            }
        }
Dog d1 = new Dog();
            Dog d2 = new Dog();
            Dog d = d1.Mating(d2);
            Console.WriteLine(d.Name);
谢谢,我试试泛型
  • 打赏
  • 举报
回复
引用 8 楼 dongqingtree 的回复:
[quote=引用 5 楼 sp1234 的回复:] 你说“狗是动物”,那么别人都理解你。如果你说“动物都是狗”,那么别人就以为你一定是被狗吓坏了、有了后遗症的结果。所以这是最基本的逻辑,任何一个真正的OOPL都会拒绝编译和执行后者的逻辑的。
既然都有Dog做主体了,调用Mating后的能是个Cat吗?如果能识别主体是什么类型,那返回一样的类型不就可以了吗?[/quote] 这个还真可以有,不然狮虎兽之类的怎么来的
effun 2015-05-28
  • 打赏
  • 举报
回复

    public class Animal
    {
        public Animal Mating(Animal a)
        {
            return (Animal)Activator.CreateInstance(this.GetType());
        }
    }
 
    public class Cat : Animal
    {
        public new Cat Mating(Animal a)
        {
            if (!(a is Cat))
               throw new ArgumentExceiption();
            return (Cat)base.Mating(cat);
        }
    }
 
    public class Dog : Animal
    {
        public Dog Mating(Dog dog)
        {
            return (Dog)base.Mating(dog);
        }
    }
以上代码用两种方式实现你的需求
於黾 2015-05-28
  • 打赏
  • 举报
回复
return new Animal(); 这句代码不对. 不要return父类.你应该根据子类类型,返回对应的子类对象实例,而不是返回父类实例.
gengchenhui 2015-05-28
  • 打赏
  • 举报
回复
这种代码确实毫无道理。。。 楼主思路不对,可以说说想实现什么样的需求。。。
  • 打赏
  • 举报
回复
你说“狗是动物”,那么别人都理解你。如果你说“动物都是狗”,那么别人就以为你一定是被狗吓坏了、有了后遗症的结果。所以这是最基本的逻辑,任何一个真正的OOPL都会拒绝编译和执行后者的逻辑的。
  • 打赏
  • 举报
回复
Dog d = d1.Mating(d2);
这种代码毫无道理。任何一个强类型的OOPL语言都不允许这种引用。
  • 打赏
  • 举报
回复
public abstract class Animal
        {
            public abstract string Name { get; }
            public T Mating<T>(T a)
                where T : Animal, new()
            {
                return new T();
            }
        }

        public class Cat : Animal
        {
            public override string Name
            {
                get { return "Cat"; }
            }
        }

        public class Dog : Animal
        {
            public override string Name
            {
                get { return "Dog"; }
            }
        }
Dog d1 = new Dog();
            Dog d2 = new Dog();
            Dog d = d1.Mating(d2);
            Console.WriteLine(d.Name);
  • 打赏
  • 举报
回复
或者你可以设置泛型方法
  • 打赏
  • 举报
回复
父类怎么知道你会有什么子类,正常的话这应该是子类来override或者实现的部分,除非父类默认就知道(或者说定义)规则,比如反射当前类名进而创建实例

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧