【问题标题】:Common type but different methods通用类型但方法不同
【发布时间】:2018-08-28 16:05:03
【问题描述】:

我必须与三个不同的系统进行通信。对于每个系统,我必须以不同的方式进行通信并获取不同类型的数据。例如,对于两个系统,我必须使用 REST API 进行通信,而对于第三个系统,我必须使用 NET.TCP 协议进行通信。

我的问题是,我可以使用某种模式或某种抽象吗? 据我所知,如果不进行强制转换,不可能有一个共同的类型(接口)但有不同的方法。我正在使用 C#

【问题讨论】:

  • 代理或适配器模式可能会这样做。
  • 你可以用接口抽象出任何东西。不知道“不可能”是什么意思
  • 这取决于您希望如何从这些系统中获取数据。您将同时从其中一个系统获取数据,还是同时从所有三个系统获取数据?
  • 您可以创建一个接口和三个具体类。每个系统一个,并使用策略模式在运行时决定从哪里获取数据。

标签: c# oop interface abstract-class


【解决方案1】:

你可以使用泛型

public interface IDataSource<TData>
{
    IEnumerable<TData> GetData();
}

如果您可以传递描述源地址的相同类型的参数,例如一个简单的字符串,你可以用

声明接口
public interface IDataSource<TData>
{
    IEnumerable<TData> GetData(string address);
}

如果由于不同的系统需要不同的参数集而无法做到这一点,您可以使用第一个接口并将参数传递给不同实现的构造函数。由于构造函数永远不是接口的一部分,因此您始终可以这样做。

另一种可能性是为地址对象添加一个额外的泛型类型参数。

public interface IDataSource<TData, TAddress>
{
    IEnumerable<TData> GetData(TAddress address);
}

如果不同的数据源需要兼容,例如因为你想将它们插入到List&lt;T&gt;,你也可以声明一个非泛型接口

public interface IDataSource
{
    IEnumerable GetData();
}

public interface IDataSource<TData> : IDataSource
{
    IEnumerable<TData> GetData();
}

如果没有通过IDataSource 访问,实现将显式实现非泛型接口并因此自动隐藏其成员。该列表现在可以声明为List&lt;IDataSource&gt;

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多