Я работаю со старым (.NET 1) API, который я не могу изменить. API не имеет интерфейсов. У меня есть базовый класс (Pet
) с конкретными классами (Cat
, Parrot
), которые имеют по существу «тот же» метод (GetLegs()
). Я хочу, чтобы мой вспомогательный класс «отключался» и просто вызывал метод, используя тип экземпляра. Я хочу избежать размышлений.Метод вызова с тем же именем для разных типов
Моя попытка имеет тип включения. Это разумный подход? Должен ли я быть заинтересован (на уровне «теории»), что Type
слишком общий?
namespace TheApi
{
public class Pet
{
}
public class Cat : Pet
{
public string[] GetLegs() =>
new[] { "Front left", "Front right", "Back left", "Back right" };
}
public class Parrot : Pet
{
public string[] GetLegs() =>
new[] { "Left", "Right" };
}
}
namespace MyApp
{
using System;
using System.Collections.Generic;
using NUnit.Framework;
using TheApi;
public static class Helper
{
public static string[] GetLegsFor(Pet pet)
{
return MapTypeToGetter[pet.GetType()](pet);
}
private static Dictionary<Type, Func<Pet, string[]>> MapTypeToGetter =>
new Dictionary<Type, Func<Pet, string[]>>
{
[typeof(Cat)] = p => ((Cat)p).GetLegs(),
[typeof(Parrot)] = p => ((Parrot)p).GetLegs()
};
}
public class Tests
{
[Test]
public void Test()
{
Pet bird = new Parrot();
var legs = Helper.GetLegsFor(bird);
var expectedLegs = new[] { "Left", "Right" };
Assert.That(legs, Is.EqualTo(expectedLegs));
}
}
}
вы должны иметь интерфейс - 'IHaveLegs'. –
Почему бы просто не использовать метод расширения на 'Pet'? –
@ DanielA.White OP сказал: Я работаю со старым (.NET 1) API, который я не могу изменить. API не имеет интерфейсов. – CodingYoshi