繁体   English   中英

接口实现,但不公开实现接口的类

[英]Interface implementation without revealing the class that implements the interface

嗨,我们如何在实时场景中实现接口?

这是我的情况

我做了一个有2种方法的接口IPayPal

void SaleTransaction();
void VoidTransaction();

现在我有一个实现此服务的PayPal类。

class PayPal:IPayPal{

    public void SaleTransaction(){
    // Implementation happens here

    }

    public void VoidTransaction(){
    // Implementation happens here

    }



}

现在我有一项服务,要求PayPal提供服务

可以说

class Service{

IPayPal pp=null;


static void Main(){

    pp=new PayPal();
    //Now i do not want to expose all the methods in my class PayPal 
    // is there any other way to just show pp.SaleOneTransaction() method?? i donot want the //PayPal class to be present in this Program..

    //Please tell me how to acheive this.
    }

}

即,请告诉我一种可以初始化我的接口类而又不暴露实现该接口的类的方法。

谢谢

两种选择:

  • 简单地说,不要公开不想从其他程序集中调用的公共方法。 不要公开甚至不想从程序集中其他类调用的内部方法。

  • 创建一个包装所有代理的包装器:

     public class PaymentProxy : IPayPal { private readonly IPayPal original; public PaymentProxy(IPayPal original) { this.original = original; } public void SaleTransaction() { original.SaleTransaction(); } public void VoidTransaction() { original.VoidTransaction(); } } 

    此时,您可以使用原始的“秘密”对象创建一个PaymentProxy ,信任不要泄漏有关其的信息,并将该代理交给任何东西。 当然,这对于防止反射等是不安全的-但它确实掩盖了防止实现细节被“偶然地”快速而又肮脏地使用的方法,“好吧,我知道它将真的是PayPal ,所以我们将其转换为那...”骇客。

我会建议:

  1. 了解有关依赖项注入及其如何以松散耦合方式轻松帮助您解决依赖项的信息。
  2. 接口名称“ IPayPal”不是很好的名字恕我直言。 这是非常特定于一个付款提供商。 假设明天您想实现另一种不是paypal的付款方式,但又想使用相同的接口。 我认为该名称应该像“ IPaymentProvider”一样通用,并且当前的实现是PayPal(但使用该接口的其他任何类都不应该关心或知道这一点)。

祝好运!

您可以将2种方法分成2个接口。

interface IPayPal1{
    void SaleTransaction();
}
interface IPayPal2{
    void VoidTransaction();
}

class PayPal:IPayPal1, IPayPal2{
    void SaleTransaction(){
        //
    }
    void VoidTransaction(){
        //
    }
}

class Service{
    IPayPal1 pp=null;

    static void Main(){
        pp=new PayPal(); //you cannot access VoidTransaction here
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM