rajasekhara reddy Ответов: 2

Универсальная реализация compareto() доступность метода


Я пытаюсь реализовать универсальный код для обработки сбережений и проверки банковских счетов. Этот код должен работать в соответствии с приведенными ниже условиями.

1) Общие методы добавления() и снятия() для сберегательных и контрольных счетов.
2) общая реализация IComparable< T> Для сравнения любых двух счетов на основе баланса.
3) не должно быть никакого жестко закодированного литья типов.

interface IBankAccount
        {
            decimal Balance { get; set; }
            string AccountType { get; set; }
            bool Add(decimal amount);
            bool Withdraw(decimal amount);        
        }
    
        abstract class BankAccount<T> : IBankAccount, IComparable<T> where T : IBankAccount
        {
            public decimal Balance { get; set; } = 0;
    
            public string AccountType { get; set; } = string.Empty;
    
            public bool Add(decimal amount)
            {
                Balance += amount;
                return true;
            }
    
            public bool Withdraw(decimal amount)
            {
                if ((Balance - amount) < 0)
                {
                    return false;
                }
    
                Balance -= amount;
                return true;
            }       
    
            public int CompareTo(T other)
            {
                if (this.Balance == other.Balance)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
        }
    
        class SavingsAccount : BankAccount<SavingsAccount>
        {
            public SavingsAccount()
            {
                this.Balance = 500;
                this.AccountType = "Savings";
            }
        }
    
        class CheckInAccount : BankAccount<CheckInAccount>
        {
            public CheckInAccount()
            {
                this.Balance = 1000;
                this.AccountType = "CheckIn";
            }
        }  
        
        class Customer 
        {
            public IList<IBankAccount> accounts = new List<IBankAccount>();
            public void CreateAccount<T>() where T : BankAccount<T>, new()
            {            
                T account = new T();
                accounts.Add(account);           
            }      
        }
    
     class Program
        {
            static void Main(string[] args)
            {
                Customer customer1 = new Customer();
                customer1.CreateAccount<SavingsAccount>();
                customer1.CreateAccount<CheckInAccount>();
    
                Customer customer2 = new Customer();
                customer2.CreateAccount<CheckInAccount>();
    
                Customer customer3 = new Customer();
                customer3.CreateAccount<SavingsAccount>();
                customer3.CreateAccount<CheckInAccount>();
    
                customer3.accounts[0].Add(500);
    
                // How can I compare customer3.accounts[0] and customer1.accounts[1] equality as I can't access CompareTo() method?
    
                Console.Read();
            }
        }


Пожалуйста, предложите способ доступа к методу CompareTo ()? Я в порядке с интерфейсом IBankAccount, наследующим IComparable< T>, как показано ниже, если это простое решение.

interface IBankAccount<T> : IComprable<T>
    {
    }


Что я уже пробовал:

Я попробовал интерфейс IBankAccount, унаследовав интерфейс IComparable и пару других вещей, упомянутых в вопросе. Но во всех случаях я либо получал жестко закодированное приведение типов, либо не мог получить доступ к ожидаемым методам.

2 Ответов

Рейтинг:
2

johannesnestler

вы слишком абстрагировали свой код - хе-хе?

Без шуток, если вы пишете такой код, вы должны быть достаточно тверды с концепциями и реализациями ООП - просто потому, что что-то является хорошей практикой, это не значит, что вы должны его использовать...

Итак, давайте посмотрим, что у вас здесь есть: список IBankAccounts ваших клиентов - есть ли у этого интерфейса метод сравнения-нет, поэтому вы не можете получить к нему доступ - логично
Что вам нужно: список экземпляров BankAccount<t> для ваших клиентов, которые имеют вашу общую реализацию сравнения. Все благо.
Но, может быть, вы планируете добавить банковские реквизиты в<Т> реализаций (маловероятно, противоречит цели здесь) так что, как Фил.о тебе показал выше - сделать каждый реализатор IBankAccount в<Т> также реализовать интерфейс icomparable&ЛТ;ibankaccount&ЛТ;п&ГТ;&ГТ;. Как он сказал, Я не вижу здесь никакой необходимости в дженериках, просто нормальное наследование, хотя я не знаю, что вы планируете с этим делать (так что, возможно, у вас есть и другие веские причины)

Помогает ли это исправить ваш код сейчас?

С уважением Йоханнес


rajasekhara reddy

Ага. Я на 100% согласен с вашими комментариями. Спасибо, что открыли новые двери.

Рейтинг:
14

phil.o

Ваш интерфейс должен быть

interface IBankAccount<T> : IComparable<IBankAccount<T>>
{ }

abstract class BankAccount<T> : IBankAccount<T>
{
   public int Compare(IBankAccount<T> other)
   {
      return Balance.CompareTo(other.Balance);
   }
}

Но я не уверен, что вам здесь нужен дженерик. Достаточно наследования.