在我无法修改的类中实现多态行为的最佳方法是什么?我目前有一些代码,如:
if(obj is ClassA) { // ... } else if(obj is ClassB) { // ... } else if ...
显而易见的答案是向基类添加一个虚方法,但遗憾的是代码在不同的程序集中,我无法修改它.有没有比上面的丑陋和慢速代码更好的方法来处理这个问题?
嗯...似乎更适合适配器.
public interface ITheInterfaceYouNeed { void DoWhatYouWant(); } public class MyA : ITheInterfaceYouNeed { protected ClassA _actualA; public MyA( ClassA actualA ) { _actualA = actualA; } public void DoWhatYouWant() { _actualA.DoWhatADoes(); } } public class MyB : ITheInterfaceYouNeed { protected ClassB _actualB; public MyB( ClassB actualB ) { _actualB = actualB; } public void DoWhatYouWant() { _actualB.DoWhatBDoes(); } }
看起来像很多代码,但它会使客户端代码更接近你想要的.此外,它还可以让您有机会思考您实际使用的界面.
查看访客模式.这使您可以在不更改类的情况下将虚拟方法添加到类中.如果您正在使用的基类没有Visit方法,则需要使用带有动态强制转换的扩展方法.这是一些示例代码:
public class Main { public static void Example() { Base a = new GirlChild(); var v = new Visitor(); a.Visit(v); } } static class Ext { public static void Visit(this object b, Visitor v) { ((dynamic)v).Visit((dynamic)b); } } public class Visitor { public void Visit(Base b) { throw new NotImplementedException(); } public void Visit(BoyChild b) { Console.WriteLine("It's a boy!"); } public void Visit(GirlChild g) { Console.WriteLine("It's a girl!"); } } //Below this line are the classes you don't have to change. public class Base { } public class BoyChild : Base { } public class GirlChild : Base { }