ここでは、実際にクライアントコードを壊す可能性があり、新たなメソッドを追加する1つの方法があります...
void Main()
{
var oldFoo = new OldFoo();
var oldResult = oldFoo.Calculate(2, 2); // 4
var newFoo = new NewFoo();
var newResult = newFoo.Calculate(2, 2); // 0
}
public class OldFoo
{
public int Calculate(params int[] values)
{
return values.Sum();
}
}
public class NewFoo
{
public int Calculate(params int[] values)
{
return values.Sum();
}
public int Calculate(int value1, int value2)
{
return value1 - value2;
}
}
そして、ここでは
初め...、特に拡張メソッドを扱う別の方法ですクライアントは、Foo
にCombine
の能力を与える拡張方法を定義します。
void Main()
{
var foo = new Foo();
var result = foo.Combine(2, 2); // "22"
}
public static class Extensions // added by client
{
public static string Combine(this Foo foo, params int[] values)
{
return string.Join(string.Empty, values.Select(x => x.ToString()));
}
}
public class Foo { }
その後、Foo
の開発者がクラスに新しいCombine
メソッド追加:拡張メソッドが効果的にブロックされるかが新しいCombine
インスタンスメソッドでを影にすることを
void Main()
{
var foo = new Foo();
var result = foo.Combine(2, 2); // 4
}
public static class Extensions
{
public static string Combine(this Foo foo, params int[] values)
{
return string.Join(string.Empty, values.Select(x => x.ToString()));
}
}
public class Foo
{
public int Combine(params int[] values)
{
return values.Sum();
}
}
注意を。
ある実装から別の実装にある型のインスタンスに対して、指定されたメソッドが呼び出されたときに実行されるコードの変更が、そのコードに何らかの影響を与える可能性がありますか? – Servy
コードを変更するのではなく、クラスに追加しました。明らかに、他のクラスが依存しているコードでは、それが危険な手を出すことがわかります。しかし、以下の受け入れられた回答のように、特定のパラメータ(古いコードメソッド呼び出しで使用できる)の元のメソッドよりも優先されるメソッドのオーバーロードを追加することは、思った。 –
@GeorgeWooding、私の答えに2番目の例を追加しました。 – devuxer