2017-01-06 13 views
0

私は古い(.NET 1)APIを使用しています。私は変更できません。 APIにはインタフェースがありません。基本的に '同じ'メソッド(GetLegs())を持つ具体クラス(CatParrot)を持つ基本クラス(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)); 
     } 
    } 
} 
+4

言うことができます - 'IHaveLegs'を。 –

+4

単に「ペット」の拡張メソッドを使用するのはなぜですか? –

+1

@ DanielA.White OPによると、私は変更できない古い(.NET 1)APIを使っています。 APIにはインタフェースがありません。 – CodingYoshi

答えて

2

私は私のヘルパークラスには「離れabtract」とだけインスタンスのタイプを使用してメソッドを呼び出したいです。私は反射を避けたい。

私はヘルパークラスを全く書いていません。私は、拡張メソッド記述します

namespace PetesExtensions 
{ 
    public static class PetExtensions 
    { 
    public static string[] GetLegs(this Pet pet) 
    { 
     if (pet == null) throw new ArgumentNullException("pet"); 
     if (pet is Cat) return ((Cat)pet).GetLegs(); 
     if (pet is Parrot) return ((Parrot)pet).GetLegs(); 
     throw new Exception(
     $"I don't know how to get the legs of a {pet.GetType().Name}. Contact Pete Moloy."); 
    } 
    } 
} 

をそして、あなたはインターフェイスが必要

using PetesExtensions; 
... 
Pet p = whatever; 
string[] legs = p.GetLegs(); 
+0

こんにちはエリック、私はOOPの概念を噛んでみようとしています。拡張メソッドv。インタフェースを作成する利点は何でしょうか。 'ペット 'でも足がない' Worm'クラスを作りたいとしましょう。私はどのペットが足を持っているかどうかを選ぶことができるので、私はインターフェースを使ってより良くなるのではないでしょうか?ありがとう。 – Zuzlx

+2

@Zuzlx:もちろんそれは良いでしょう。問題の前提は、インタフェースの使用は不可能であるということです。質問の最初の2つの文章をもう一度読みます。 –

+0

拡張メソッドは、私が私のものに加えることができる構文的な砂糖です。しかし、あなたのアプラックは私のものと実際には違いますか? – petemoloy

関連する問題