接口实现没有透露实现接口的类

时间:2012-02-09 06:26:17

标签: c# 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.
    }

}

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

由于

3 个答案:

答案 0 :(得分:2)

两个选项:

  • 不要简单地公开您不希望从其他程序集调用的公共方法。不要公开您不希望从程序集中的其他类调用的内部方法。

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

    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)

我建议:

  1. 阅读dependency injection以及它如何帮助您轻松地以松耦合方式解决依赖关系。
  2. 界面名称“IPayPal”不是很好的名字恕我直言。它对一个支付提供商非常具体。假设您明天要实施另一种非Paypal的付款方式,但您希望使用相同的界面。我认为名称应该是通用的,如“IPaymentProvider”,当前的实现是PayPal(但是没有其他使用该接口的类应该关心或了解这一点。)
  3. 祝你好运!

答案 2 :(得分:0)

您可以将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
    }
}