【问题标题】:Convert the interface implementation object from one namespace to another since both are having the same interface but different namespace将接口实现对象从一个命名空间转换为另一个,因为两者具有相同的接口但不同的命名空间
【发布时间】:2020-11-21 18:11:06
【问题描述】:

有没有办法将接口实现对象从一个命名空间转换为另一个,因为两者都具有相同的接口,但只有命名空间不同?

用例如下所示

namespace namespaceA
{
    Public Interface IInterface
    {
        Method1();
        Method2();
    }
}

namespace namespaceB
{
    Public Interface IInterface
    {
        Method1();
        Method2();
    }
}

我们得到两种对象。

namespaceA.IInterface 对象 - 新实现

namespaceB.IInterface 对象。 - 作为遗留实现的一部分存在。

我们希望在代码中只处理一个对象,即 namespaceA.IInterface 对象,基于新的实现。 但是由于遗留实现,我们也得到了 namespaceB.IInterface 对象。 但我们不想对遗留对象进行任何特定处理,我们希望以与新对象和实现相同的方式处理。

如果我们得到一个 namespaceB.IInterface 对象,如果接口定义相同但只存在于不同的命名空间中,是否有办法将其转换/转换为 namespaceA.IInterface 对象?

因此代码不必只担心遗留对象的处理。

【问题讨论】:

  • 从编译器的角度来看,这是两个不相关的接口,因为它们位于不同的命名空间中。不确定是否可以自动“转换/转换”一个到另一个。
  • 命名空间似乎是一种解决向后兼容性问题的尝试。确认?
  • 你不能从 A 继承接口 B 吗?所以每个遗留对象已经新接口的一个实例。

标签: c# design-patterns architecture


【解决方案1】:

不 - 有两种完全不同的类型,没有任何关系。仅仅因为它们具有相同的成员名称并不意味着您可以从一个转换到另一个。

不过,您可以使用 适配器

public class Adapter: namespaceA.IInterface
{
    private namespaceB.IInterface target;
    public Adapter(namespaceB.IInterface target)
    {
        this.Target = target
    }

    public void Method1() {this.Target.Method1();}
    public void Method2() {this.Target.Method2();}
}

【讨论】:

    【解决方案2】:

    我会从旧接口继承新接口,以便实现旧接口的每个对象也实现新接口,因此可以轻松地转换为它。这当然假设新的成员具有完全相同的成员。否则,您需要将 INew 的实现添加到您的所有类中,我假设您想避免这种情况:

    interface ILegacy : INew { /* completely empty */ }
    interface INew 
    { 
        Method1();
        Method2();
    }
    

    您甚至可以将ILegacy-interface Obsolete 替换为INew

    【讨论】:

    • 好点!除非他们无法修改旧版界面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2011-04-10
    • 2016-09-16
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多