2012-02-09 36 views
2

こんにちは、リアルタイムシナリオでインターフェイスを実装する方法は?インターフェイスを実装していないインターフェイスの実装

これが私の状況

である私は今、私はこのサービスを実装するクラスのPayPalを持っている2つの方法

void SaleTransaction(); 
void VoidTransaction(); 

を持つインタフェースIPayPalを行っています。

class PayPal:IPayPal{ 

    public void SaleTransaction(){ 
    // Implementation happens here 

    } 

    public void VoidTransaction(){ 
    // Implementation happens here 

    } 



} 

今私は

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. 
    } 

} 

すなわちを言うことができますペイパル

からサービスを要求するサービスを持っている私に、私は、そのクラスを明らかにすることなく、私のインターフェイスクラスを初期化することができる方法を教えてくださいインタフェースを実装します。

おかげ

答えて

2

私がお勧めします:

  1. dependency injectionを読み、どのようにそれはあなたが簡単かつ緩い結合方法で依存関係を解決するのに役立ちます。
  2. インタフェース名 "IPayPal"はあまり良い名前ではありません。これは、1つの支払いプロバイダにとって非常に特有のものです。明日、ペイパルではない、同じインターフェースを使用したい別の支払い方法を実装したいとします。私はその名前が "IPaymentProvider"のような一般的なものでなければならないと思います。現在の実装はPayPalです(しかし、このインタフェースを使用する他のクラスは気にする必要はありません)。

幸運!

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になるはずです。それ... "ハック。

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 
    } 
} 
関連する問題