110,529
社区成员
发帖
与我相关
我的任务
分享
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 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);
}
}
以上代码用两种方式实现你的需求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);