关于C#中接口的问题

7
这是我的问题...
我在电信行业工作,有一款软件可以为给定的服务号码或安装地址提供最佳网络。我们公司使用批发商的网络和我们自己的网络。为了评估客户可能能够获得哪些服务,我调用一个 Web 服务来查找给定电话交换机上可用的服务,并根据可用的服务,需要针对我们的网络或批发商的网络运行一些检查。
我的问题是如何使用 C# 接口对此进行建模?我拥有的软件不使用任何接口,而且无论存在什么类,都只是为了满足代码不能在类外部生存的事实。
我熟悉接口的概念,至少在理论层面上,但对编程到接口的概念并不是很熟悉。
我的想法是沿着以下思路:
创建一个名为 IServiceQualification 的接口,其中定义了一个操作:void Qualify()。创建两个类 QualifyByNumber 和 QualifyByAddress,两者都实现该接口并定义了操作 Qualify 的详细信息。我是否考虑得正确,或者有不同/更好的方法来解决这个问题?
我已经阅读了一些关于编程到接口的示例,但希望看到在工作情况下的应用。
欢迎提出评论/建议。

1
对我来说看起来不错。重要的是要尝试一下,如果不行就不要害怕重新开始(除非你有时间限制)。 - Skizz
3个回答

1
你应该把接口想象为一份合约。它规定一个类实现了某种函数签名,意味着你的类可以使用已知的参数调用它们,并期待获得特定的对象返回——中间发生了什么取决于接口开发者。这种松散的耦合使你的类系统更加灵活(与节省按键无关)。
下面是一个例子,大致针对你的情况(但需要进行更多建模)。
public interface IServiceQualification{
    bool Qualifies(Service serv);
}

public class ClientTelephoneService : IServiceQualification
{
    public bool Qualifies(Service serv){
       return serv.TelNumber.Contains("01234");
    }
}

public class ClientAddressService : IServiceQualification
{
    public bool Qualifies(Service serv){
       return serv.Address.Contains("ABC");
    }
}

//just a dummy service
public class Service{
    public string TelNumber = "0123456789";
    public string Address = "ABC";
}

//implementation of a checker which has a list of available services and takes a client who implements the
//interface (meaning we know we can call the Qualifies method
public class ClassThatReturnsTheAvailableServices
{
    //ctor
    List<Service> services = //your list of all services

    public List<Service> CheckServices(IServiceQualification clientServiceDetails)
    {
        var servicesThatQualify = new List<Service>();
        foreach(var service in services){
            if(clientServiceDetails.Qualifies(service)){
                 services.Add(service);
            }
        }
        return servicesThatQualify;
    }
}

1

我可能会让它更深入一些,但你走在了正确的轨道上。我个人会创建一个IServiceQualification接口,其中包含一个Qualify方法,然后在其下面创建一个抽象类ServiceQualification,该类将具有一个名为Qualify的抽象方法,任何类型的限定符类都可以实现该方法。这样可以让您定义限定符之间的共同行为(肯定会有一些),同时仍然在高层次上创建关注点分离。

接口有一个明确定义的目的,正确使用它们可以让您以任何想要的方式进行实现,而不需要您的代码要求实现。因此,我们可以创建一个类似于以下内容的服务:

public bool ShouldQualify(IServiceQualification qualification)

无论我们发送的实现方式如何,这种方法都能正常工作。一旦它开始运行,你就不需要再去修改或更改它。此外,它还可以直接帮助你找到错误。如果有人报告地址资格认证无法正常工作,你就知道要去哪里查找了。

谢谢回复。因此,实际上,抽象类ServiceQualification将实现IServiceQualification接口,而其他限定符将从ServiceQualification扩展。 - Michael
@Michael:没错。只需确保在代码的其他部分中引用接口而不是抽象类。使用接口作为公共契约,使用抽象类作为内部代码重用的手段。这将使您有自由创建一个实现接口的类,该类不继承自抽象类(这很重要,因为类只能直接从单个基类继承,并且如果不需要,您不想束缚自己)。 - vgru

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接