在不知道类型的情况下传递类的实例

本文关键字:实例 情况下 不知道 类型 | 更新日期: 2023-09-27 18:35:21

我想知道如何在不知道对象类型的情况下传递对象的实例。我想知道这一点,因为如果我有 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!")
        }
    }
}

如果有人知道对此的替代解决方案,那么请继续分享!

谢谢。

编辑:我认为你还需要参考动物,而不仅仅是把它传下来。

在不知道类型的情况下传递类的实例

这就是多态性的用途:

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();
    }
}

创建一个名为 IAnimal 的接口(包含类或结构可以实现的一组相关功能的定义),其中包含一个 Description 属性,该属性为您的Dog类等返回"我们治愈好狗!每个具体的动物类都实现此接口,这意味着您可以在cureAnimal方法中调用 Description 属性。

使用多态性

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!");
    }
}

如果要像现在一样在 AnimalClinic 类中定义Cure逻辑,则可能必须执行某种条件执行。

这种条件执行不必像大量的if语句甚至switch那样笨拙。您可以在SO上研究if语句的替代解决方案。事实上,Joel Coehoorn已经提供了一个。

我相信这里最好的选择是使用策略设计模式。这里完美解释 http://www.dofactory.com/net/strategy-design-pattern

ByteBlast 和 Joel Coehoorn 的答案为您的案例提供了一个例子

相关文章: