Достъп до полетата на наследяващ клас в списък от тип родителски клас?


0

Колеги, при решаване на втора задача от "Принципи на ООП - част II" се получи следната ситуация:

Имам абстрактен клас Account, който е наследяван от DepositAccount.

DepositAccount наследява интерфейса IDeposit с метод DepositFunds().

Клас Customer има пропърти List<Account> ClientAccounts.

Правя масив с обекти от тип Customer и добавям сметка:

firstCustomers[0].ClientAccounts.Add(new DepositAccount(.....);

Има ли начин ли да достъпя метода DepositFunds() през firstCustomers[0].ClientAccounts[0] ? Т.е. има ли начин да кажа, че искам да работя с вътрешния тип на обекта, ако мога така да се изразя?

Въпросът е принципен, затова отварям тук тема, а не в темата за решението на задачата.

Дано е станало ясно питането ми. Кодът е малко тежък за четене, защото имам доста класове. Ето го все пак на този етап.


в C# OOP от Drago (711 точки)


Отговори



2

firstCustomers[0].ClientAccounts.OfType<DepositAccount>() ти връща сметките от списъка, които са с runtime тип DepositAccount, след което с ElementAt, First или ToArray() можеш да си вземеш някоя определена или да ги запазиш в масив.

firstCustomers[0].ClientAccounts.OfType<DepositAccount>().First().DepositFunds(10)

Няма как да кажеш че "искаш да работиш с вътрешния тип", тъй като той в момента на писане на програмата не е известен. Ако пазиш обектите в списък List<Account>, компилаторът знае, че са от тип Account или някой от наследниците му, но нищо повече.


от staafl (5770 точки)


0
Ясно, няма да задълбавам повече.

от Drago (711 точки)


0

Нямам възможност да тествам с VS, но ми се струва че трябва да кастнеш firstCustomers[0].ClientAccounts[0] към DepositAccount и ще получиш достъп до DepositFunds. Нещо като:

if(firstCustomers[0].ClientAccounts[0] is DepositAccount)

{

(DepositAccount)firstCustomers[0].ClientAccounts[0].DepositFunds(...);

}


от ttitto (1950 точки)


0
Не става. Пак ми дава полетата само на класа Account.

от Drago (711 точки)

0
Понеже всички банкови акаунти имат могат да им се прави депозит, сложи IDeposit на Account и имплементирай метода в другите подкласове на account. Не знам дали това ще помогне, но ми направи впечатление

от ttitto (1950 точки)



2
Това би трябвало да ти свърши работа        
 
DepositAccount acc = firstCustomers[0].ClientAccounts[0] as DepositAccount;
 
if (acc != null)
{
    acc.DepositFunds(10);
}

от westi3m (5621 точки)


0
Т.е. няма начин да поискаме вътрешния тип на обекта направо, а трябва да кастнем по някакъв начин? Edit: да, това ще свърши работа, но става малко дълго.

от Drago (711 точки)

0
Ти си направил списък от Account-и и можеш да използваш само методите, пропъртита (.. member-ите), които този клас ти предоставя. Ако знаеш, че класа всъщност е DepositAccount го кастваш, проверяваш дали е успешно кастването и работиш вече с DepositAccount.

от westi3m (5621 точки)