将具有相同接口或基类的类传递给重载方法

时间:2015-06-17 16:21:55

标签: c#

我有一个具有x个属性的基类,然后我得到了具有更多属性的类。如何处理方法中的公共字段,然后将对象发送到另一个可以处理其附加属性的方法?

示例:

public Interface IAnimal {
    int NoOfFeet;
}

class Animal: IAnimal {
    int NoOfFeet {get;set;}
}

class Elephant: Animal {
   bool hasTrunk {get;set;}
}

class Dog:Animal {
   string canBark {get;set;}
}

Method1(IAnimal a) {
    //process NoOfFeet     ...

    //process fields for derived type
    DoSomething(IAnimal a)
}    

DoSomething(Elephant e) {
     //process trunk
}

DoSomething(Dog d) {
     //process canbark
}

4 个答案:

答案 0 :(得分:5)

听起来你基本上想要在执行时重载解析。 (我假设您不能引入虚拟方法来做正确的事情,并在每个类中实现它。如果实现了解您的内容是合理的,那将是最干净的方法。 #39;与他们一起做,但情况并非总是这样。)实现这一目标的最简单方法是使用dynamic,如C#4中所述:

public void Method(IAnimal animal)
{
    // We don't want to call Handle with a null reference,
    // or we'd get an exception to due overload ambiguity
    if (animal == null)
    {
        throw new ArgumentNullException("animal");
    }
    // Do things with just the IAnimal properties
    Handle((dynamic) animal);
}

private void Handle(Dog dog)
{
    ...
}

private void Handle(Elephant elephant)
{
    ...
}

private void Handle(object fallback)
{
    // This method will be called if none of the other overloads
    // is applicable, e.g. if a "new" implementation is provided
}

答案 1 :(得分:1)

不进入高级策略的最佳方法是使用is关键字。

例如:

Method1(IAnimal a) {
    // process NoOfFeet

    if (a is Elephant)
        DoSomething((Elephant)a);
    else if (a is Dog)
        DoSomething((Dog)a);
}

如果ElephantDog等可能包含您需要专门解决的其他子类,那么您需要使用typeof代替is

Method1(IAnimal a) {
    // process NoOfFeet

    if (a.GetType() == typeof(Elephant))
        DoSomething((Elephant)a);
    else if (a.GetType() == typeof(Dog))
        DoSomething((Dog)a);
}

答案 2 :(得分:1)

将该方法作为该类的一部分并覆盖它。

<p id="spinner">Stop, I'm getting dizzy!</p>

答案 3 :(得分:0)

听起来你可以使用Template method pattern

abstract class Animal
{
    public void DoSomething()
    {
        // do stuff all animals have here

        DoSomethingVirtual(); // call virtual method to do stuff for specific animal
    }

    private abstract void DoSomethingVirtual();
}

class Elephant : Animal
{
    private override void DoSomethingVirtual()
    {
        // do elephant stuff here
    }
}

现在当您在任何动物对象上调用DoSomething()时,基类将处理常用功能,然后将执行传递给派生类以便