继承类型的动态切换方法

问题描述 投票:0回答:2

在C#中,我知道有一种在运行时根据抽象参数的具体类型切换方法调用的方法。

因此,在下面的示例中,不需要整个Wash(Animal)方法,并且C#将在运行时根据具体的Animal类型来知道要调用哪个Cat / Dog方法。有语法可以做到这一点,我之前已经做过,但是我一生都不记得它是什么。

    public void Wash(Animal animal)
    {
        switch (animal)
        {
            case Cat cat:
                Wash(cat);
                break;
            case Dog dog:
                Wash(dog);
                break;
        }
    }

    public void Wash(Cat cat)
    {

    }

    public void Wash(Dog dog)
    {

    }
c# object abstract-class
2个回答
0
投票

您的意思是这样的吗?:

    public abstract class Animal
{
    public float Weight {get; set;} 
    public string PetName {get; set;}

    public abstract string Talk();
}

public abstract class Mammal : Animal
{
    public abstract override string Talk();
}

public class Dog : Mammal
{
    public override string Talk()
    {
        return "Woof!";
    }
}

public class Cat : Mammal
{
    public override string Talk()
    {
        return "Meow!";
    }
}

您可以看到完整的代码here


0
投票

可以使用双重调度完成...

abstract class Animal
{
    public abstract void TakeBath(AnimalWasher washer);
}

class Cat : Animal
{
    public override void TakeBath(AnimalWasher washer)
    {
        washer.Wash(this);
    }
}

class Dog : Animal
{
    public override void TakeBath(AnimalWasher washer)
    {
        washer.Wash(this);
    }
}

class AnimalWasher
{
    public void Wash(Cat cat)
    {
        Console.WriteLine("washing a cat");
    }

    public void Wash(Dog dog)
    {
        Console.WriteLine("washing a dog");
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        AnimalWasher washer = new AnimalWasher();
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.TakeBath(washer);
        cat.TakeBath(washer);
    }
© www.soinside.com 2019 - 2024. All rights reserved.