Вызов метода, определенного в базовом интерфейсе - PullRequest
0 голосов
/ 14 июня 2011

Если у меня есть следующая структура интерфейса:

public interface IPaymentTypeBase
{
    void PayNow();
    double Amount { get; set; }
}

public interface IPaymentTypePayPal : IPaymentTypeBase
{
    string UserName { get; set; }
    string Password { get; set; }
}

public interface IPaymentMethod<T>
{
}

Тогда у меня есть следующие классы:

public class PaymentTypePayPal : IPaymentTypePayPal
{
    public string UserName { get; set; }
    public string Password { get; set; }

    public void PayNow()
    {
        throw new NotImplementedException();
    }
}

public class PaymentMethod<T> : IPaymentMethod<T> where T : IPaymentTypeBase
{
}

Тогда в моем веб-приложении у меня есть это;

IPaymentMethod<IPaymentTypePayPal> payer = (IPaymentMethod<IPaymentTypePayPal>) new PaymentMethod<PaymentTypePayPal>();

Теперь я хотел бы позвонить payer.PayNow();, но я просто теряюсь в интерфейсах и т. Д. И, похоже, не могу заставить это работать.

Я считаю, что это простая вещь, но я простополностью упустить точку.

Кто-нибудь может помочь?

Изменить

Намерение здесь состоит в том, чтобы иметь набор интерфейсов, таких как PayPal, Ваучер,CreditCard, каждый из которых выполняет свои собственные функции платежного шлюза.

Поэтому я хотел бы создать экземпляр класса, который принимает Тип платежа в качестве интерфейса, и вызывать интерфейс API PayNow.

Ответы [ 3 ]

1 голос
/ 14 июня 2011

плательщик типа IPaymentMethod<IPaymentTypePayPal>.

Но IPaymentMethod<T> определяется как

public interface IPaymentMethod<T>
{
}

Следовательно, у него нет методов, и вы не можете вызвать PayNow() для него.

То же самое верно для PaymentMethod<T>, поэтому вы не можете вызвать любой метод для экземпляра PaymentMethod<PaymentTypePaypal>.

Может быть, вы можете объяснить немного больше, каково ваше намерение.

0 голосов
/ 14 июня 2011

Лично я бы использовал классы, а не интерфейсы, когда задействовано наследование. Кроме того, в этом случае у вас больше косвенного обращения, чем вам, вероятно, нужно. Если вы моделируете Payment как абстрактный базовый класс (с PayNow () и Amount) и PayPalPayment в качестве подкласса, просто создайте экземпляр надлежащего подкласса с фабрики, и вы настроены со всей гибкостью, которую вы имели бы в своем подходе, но Я думаю, легче понять и поддерживать. (на самом деле не знаю всех других требований вашего приложения)

0 голосов
/ 14 июня 2011

Я не совсем уверен, почему вы используете этот класс PaymentMethod ... Но почему вы не можете изменить интерфейс IPaymentMethod на что-то вроде:

public interface IPaymentMethod<T> : IPaymentTypeBase

, чтобы U мог вызвать метод patNow ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...