Другой способ сделать это - выполнить проверку типов перед вызовом метода:
if (animal is Pig) DoPigStuff();
if (animal is Dog) DoDogStuff();
То, что вы ищете, это многократная отправка. НЕТ - C # не поддерживает множественную диспетчеризацию. Он поддерживает только одну отправку. C # может только динамически вызывать метод, основанный на типе получателя (то есть объект с левой стороны от. В вызове метода)
Этот код использует двойную отправку . Я позволю коду говорить за себя:
class DoubleDispatchSample
{
static void Main(string[]args)
{
List<Animal> list = new List<Animal>();
Pig p = new Pig(5);
Dog d = new Dog(@"/images/dog1.jpg");
list.Add(p);
list.Add(d);
Binder binder = new Binder(); // the class that knows how databinding works
foreach (Animal a in list)
{
a.BindoTo(binder); // initiate the binding
}
}
}
class Binder
{
public void DoPigStuff(Pig p)
{
label1.Text = String.Format("The pigs tail is {0}", p.TailLength);
}
public void DoDogStuff(Dog d)
{
Image1.src = d.Image;
}
}
internal abstract class Animal
{
public String Name
{
get;
set;
}
protected abstract void BindTo(Binder binder);
}
internal class Pig : Animal
{
public int TailLength
{
get;
set;
}
public Pig(int tailLength)
{
Name = "Mr Pig";
TailLength = tailLength;
}
protected override void BindTo(Binder binder)
{
// Pig knows that it's a pig - so call the appropriate method.
binder.DoPigStuff(this);
}
}
internal class Dog : Animal
{
public String Image
{
get;
set;
}
public Dog(String image)
{
Name = "Mr Dog";
Image = image;
}
protected override void BindTo(Binder binder)
{
// Pig knows that it's a pig - so call the appropriate method.
binder.DoDogStuff(this);
}
}
ПРИМЕЧАНИЕ. Ваш пример кода намного проще, чем этот. Я думаю о двойной диспетчеризации как об одной из тяжелых артиллерийских программ в программировании на C # - я использую ее только в качестве крайней меры. Но если вам нужно сделать много типов объектов и много разных типов привязок (например, вам нужно привязать их к странице HTML, но вам также нужно привязать их к WinForms, отчету или CSV) Я в конечном итоге реорганизовал бы мой код для использования двойной отправки.