私は古い(.NET 1)APIを使用しています。私は変更できません。 APIにはインタフェースがありません。基本的に '同じ'メソッド(GetLegs()
)を持つ具体クラス(Cat
、Parrot
)を持つ基本クラス(Pet
)があります。私は、ヘルパークラスを「取り除いて」、そのインスタンスの型を使ってメソッドを呼び出すだけです。私は反射を避けたい。異なるタイプの同じ名前の呼び出しメソッド
私の試みは、私のタイプを切り替えました。これは合理的なアプローチですか? 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'を。 –
単に「ペット」の拡張メソッドを使用するのはなぜですか? –
@ DanielA.White OPによると、私は変更できない古い(.NET 1)APIを使っています。 APIにはインタフェースがありません。 – CodingYoshi