Я бы хотел решить проблему (теперь гипотетическую, но перспективную в будущем), используя методы расширения и магизации интерфейса класса в будущем развитии.Методы расширения и форвардная совместимость исходного кода
Пример:
/* the code written in 17. March 2010 */
public class MySpecialList : IList<MySpecialClass> {
// ... implementation
}
// ... somewhere elsewhere ...
MySpecialList list = GetMySpecialList(); // returns list of special classes
var reversedList = list.Reverse().ToList(); // .Reverse() is extension method
/* now the "list" is unchanged and "reveresedList" has same items in reversed order */
/* --- in future the interface of MySpecialList will be changed because of reason XYZ*/
/* the code written in some future */
public class MySpecialList : IList<MySpecialClass> {
// ... implementation
public MySpecialList Reverse() {
// reverse order of items in this collection
return this;
}
}
// ... somewhere elsewhere ...
MySpecialList list = GetMySpecialList(); // returns list of special classes
var reversedList = list.Reverse().ToList(); // .Reverse() was extension method but now is instance method and do something else !
/* now the "list" is reversed order of items and "reveresedList" has same items lake in "list" */
Мой вопрос: Есть ли какой-то способ, как предотвратить этот случай (я их не нашел)? Если теперь способ, как предотвратить его, есть ли способ найти возможные проблемы, подобные этому? Если теперь можно найти возможные проблемы, не следует ли запрещать использование методов расширения?
Спасибо.
EDIT:
Ваш ответ был полезным. Могу ли я найти, где в коде используются методы расширения? И/или я могу найти, где в коде используются методы экземпляра, но существует метод расширения с одной и той же сигнатурой?
Да, я имею в виду точно такую же ситуацию. Если я правильно понимаю, самый правильный способ - использовать методы расширения, такие как статические методы, и не использовать методы расширений? Как я могу найти в обзоре кода, указанный код не использует методы расширения? – TcKs
Я не думаю, что Джаред говорит, что вызов методов расширения, как если бы они были старыми старыми статическими методами, является правильным путем; он просто говорит, что это единственный способ полностью избежать риска, который вы описываете, - но этого риска в любом случае нельзя полностью избежать. –
@JacobM правильный. – JaredPar