当前位置:  开发笔记 > 编程语言 > 正文

C# - 在类中使用多态,我没写

如何解决《C#-在类中使用多态,我没写》经验,为你挑选了2个好方法。

在我无法修改的类中实现多态行为的最佳方法是什么?我目前有一些代码,如:

if(obj is ClassA) {
    // ...
} else if(obj is ClassB) {
    // ...
} else if ...

显而易见的答案是向基类添加一个虚方法,但遗憾的是代码在不同的程序集中,我无法修改它.有没有比上面的丑陋和慢速代码更好的方法来处理这个问题?



1> harpo..:

嗯...似乎更适合适配器.

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();
    }
}

看起来像很多代码,但它会使客户端代码更接近你想要的.此外,它还可以让您有机会思考您实际使用的界面.



2> RossFabrican..:

查看访客模式.这使您可以在不更改类的情况下将虚拟方法添加到类中.如果您正在使用的基类没有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
{
}

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有