我想知道如何在不知道它们的类型的情况下传递对象的实例。我想知道这个,因为如果我有100种动物类型,那么我不想要100个if语句或转换。我提供了一个片段,这是我想要基本实现的一个例子。现在,它显然无法在我发表评论的地方工作。
using System.IO;
using System;
using System.Collections.Generic;
class Program
{
Dictionary<string, dynamic> myAnimals = new Dictionary<string, dynamic>();
Program(){
myAnimals.Add("Maggie", new Dog("Maggie"));
myAnimals["Maggie"].bark();
myAnimals.Add("Whiskers", new Cat("Whiskers"));
myAnimals["Whiskers"].meow();
animalClinic clinic = new animalClinic();
clinic.cureAnimal(myAnimals["Whiskers"]);
}
static void Main()
{
new Program();
}
}
class Dog{
string name;
public Dog(string n){
name = n;
}
public void bark(){
Console.WriteLine("\"Woof Woof\" - " + name);
}
}
class Cat{
string name;
public Cat(string n){
name = n;
}
public void meow(){
Console.WriteLine("\"Meow Meow\" - " + name);
}
}
class animalClinic(){
public void cureAnimal(object animal){ //This is where I need some help.
if(animal.name == "Maggie"){ //I know I can use 'animal.GetType() == ...' That isn't the point.
Console.WriteLine("We heal fine dogs!"); //The point is to access various methods within the object.
}else{//I know it kind of beats the point of Type-Safety, but this is only an example and another way to do this is perfectly fine with me.
Console.WriteLine("Eww a cat!")
}
}
}
如果有人知道替代解决方案,请继续分享!
感谢。
编辑:我认为您还需要引用动物,而不是仅仅将其传下来。答案 0 :(得分:3)
这就是多态性的用途:
public interface IAnimal
{
string name {get;set;}
void speak();
void cure();
}
public class Dog : IAnimal
{
public Dog (string n)
{
name = n;
}
public string name {get;set;}
public void bark()
{
Console.WriteLine("\"Woof Woof\" - " + name);
}
public void speak() { bark(); }
public void cure()
{
Console.WriteLine("We heal fine dogs!");
}
}
public class Cat : IAnimal
{
public Cat(string n)
{
name = n;
}
public string name {get;set;}
public void meow()
{
Console.WriteLine("\"Meow Meow\" - " + name);
}
public void speak() { meow(); }
public void cure()
{
Console.WriteLine("Eww a cat!");
}
}
class Program
{
static Dictionary<string, IAnimal> myAnimals = new Dictionary<string, IAnimal>();
static void Main()
{
myAnimals.Add("Maggie", new Dog("Maggie"));
myAnimals["Maggie"].speak();
myAnimals.Add("Whiskers", new Cat("Whiskers"));
myAnimals["Whiskers"].speak();
animalClinic clinic = new animalClinic();
clinic.cureAnimal(myAnimals["Whiskers"]);
}
}
public class animalClinic
{
public void cureAnimal(IAnimal animal)
{
animal.cure();
}
}
答案 1 :(得分:0)
创建interface(包含类或结构可以实现的一组相关功能的定义),名为IAnimal
,其中包含一个返回&#的Description
属性34;我们为你的Dog
课等治愈好狗!&#34; 等。你的每个具体动物类都实现了这个界面,这意味着你只需要调用Description
属性cureAnimal
。 1}}方法。
答案 2 :(得分:0)
使用polymorphism。
public abstract class Animal
{
public string Name { get; set; }
public abstract void Cure();
}
public class AnimalClinic
{
public void CureAnimal(Animal animal)
{
animal.Cure();
}
}
public class Dog : Animal
{
public override void Cure()
{
Console.WriteLine("We heal fine dogs!");
}
}
如果要像现在一样在Cure
类中定义AnimalClinic
逻辑,则可能必须执行某种类型的条件执行 。
此条件执行不必像大量if
语句甚至switch
那样笨拙。您可以在此处研究if
语句的替代解决方案。事实上,Joel Coehoorn提供了一个。
答案 3 :(得分:0)
我认为这里最好的选择是使用策略设计模式。这里完美解释http://www.dofactory.com/net/strategy-design-pattern
ByteBlast和Joel Coehoorn的答案为您的案例提供了一个例子