看下面的例子,在调用 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);
}
}
------解决思路----------------------
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);
------解决思路----------------------
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);
}
}
以上代码用两种方式实现你的需求