Реализация интерфейса без раскрытия класса, который реализует интерфейс - PullRequest
2 голосов
/ 09 февраля 2012

Привет, как мы реализуем интерфейс в режиме реального времени ??

Это моя ситуация

Я сделал интерфейс IPayPal, который имеет 2 метода

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 ]

2 голосов
/ 09 февраля 2012

Я бы посоветовал:

  1. прочитать о внедрении зависимостей и о том, как это может помочь вам легко и свободно разрешить зависимости.Название "IPayPal" не очень хорошее имя ИМХО.Это очень характерно для одного поставщика платежей.Предположим, завтра вы захотите внедрить другой способ оплаты, который не PayPal, но вы хотите использовать тот же интерфейс.Я думаю, что имя должно быть общим, как «IPaymentProvider», и текущая реализация - PayPal (но никакой другой класс, использующий этот интерфейс, не должен заботиться об этом или знать об этом).
2 голосов
/ 09 февраля 2012

Два варианта:

  • Не открывайте открытые методы, которые вы не хотите вызывать из других сборок, довольно просто.Не раскрывайте даже внутренние методы, которые вы не хотите вызывать из других классов в сборке.

  • Создайте оболочку, которая передает все вызовы:

    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 голосов
/ 09 февраля 2012

Вы можете разделить 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...