1

Тема: Поліморфізьм влазить, куди не просять

Прів. Є отаке

abstract class A { }

class B : A { }

class C : B { }

void method(A aClass)
{ /* logic */ }

public static void main()
{
    C cClass = new C();
    method(cClass);
}

Коли я передаю клас C в метод method, то в методі method воно мені каже, що я передав клас B.
Чому так?

2

Re: Поліморфізьм влазить, куди не просять

ооой, чуєте, тут інша проблема

Метод B має метод M1, котрий викликає метод M2 в цьому ж класі. А в класі C є також метод M2, і я думав, що з методу M1, котрий також присутні в класі C (тому що клас C наслідує клас B), викликається метод M2 класу C, а воно викликає метод M2 класу B.

Як то пофіксити, шоб гарно було?

3

Re: Поліморфізьм влазить, куди не просять

Наскільки я зрозумів, відбувається просто приховання методу  в дочірньому класі методом базового класу. Згідно книжки, потрібно визначати метод в базовому класі як virtual , а потім перевизначати (override) ці методи в дочірньому класі.
До речі, власне проходжу дану тему, тому велика імовірність, що я щось неправильно зрозумів.

4

Re: Поліморфізьм влазить, куди не просять

можливо оператором розширення видимості вказуйте з якого класу який метод викликаєте?

5

Re: Поліморфізьм влазить, куди не просять

справа була такойю...
є інтерфейс, котрий має пару методі, клас B реалізує цей інтерфейс, а клас C наслідує клас B.
Потім в класі B я реалізував, як я думав, метод інтерфейсу, і воно стало виглядати якось так

interface I { void M(); }
class B : I {
    void M() { }
    void M1()
    {
        M();
    }
}
class C : B { void M() { } }

І я сподівався, що коли я створюю клас C і викликаю метод M1, то він буде викликати метод M, котрий я 'реалізував' в класі C.
Але клас C не унаслідував реалізацію інтерфейсу в прямому сенці цього слова, він унаслідував методи класу B, один з котрих реалізує інтерфейс.
Тому метод M в класі C являв собою окремий метод, котрий просто мав таку саму назву і сигнатуру, як метод M в класі B, але не являвся реалізацією інтерфейсу

6

Re: Поліморфізьм влазить, куди не просять

Вам краще проголосити A,B,C,M1 і M2 змінними типу int. Тоді код буде простим і лаконічним.
А якщо у вас є завдання і предметна область - то описуйте, що саме ви робите. І код давайте, а не загальний опис.

Подякували: leofun011

7 Востаннє редагувалося FakiNyan (26.05.2016 19:54:25)

Re: Поліморфізьм влазить, куди не просять

тому по-перше, в метод M1 я почав передавати аргумент типу I, і викликати метод M через нього, а по-друге унаслідувався класом C від того інтерфейсу, і тепер все робе
koala, та я вже все зробив

8

Re: Поліморфізьм влазить, куди не просять

sensei написав:

можливо оператором розширення видимості вказуйте з якого класу який метод викликаєте?

а це шо за оператор?

9 Востаннє редагувалося sensei (26.05.2016 20:18:39)

Re: Поліморфізьм влазить, куди не просять

FakiNyan написав:

а це шо за оператор?

https://msdn.microsoft.com/en-us/library/b451xz31.aspx
для явного визначення звідки брати конкретний метод

неймспейс::якась_функція, 
клас::метод

я не впевнений наскільки це доречно в даній ситуації, але можеш перевірити

10

Re: Поліморфізьм влазить, куди не просять

це таке в с/c++, в шарпі через крапку

11

Re: Поліморфізьм влазить, куди не просять

FakiNyan написав:

Метод B має метод M1, котрий викликає метод M2 в цьому ж класі. А в класі C є також метод M2, і я думав, що з методу M1, котрий також присутні в класі C (тому що клас C наслідує клас B), викликається метод M2 класу C, а воно викликає метод M2 класу B.

Як то пофіксити, шоб гарно було?

Ви хочете щоб метод М2 класу В викликав метод М1 класу В ?
Якщо так, і якщо Ви розробник класу В, тоді створіть приватний метод МР в класі В, перенеcіть тіло методу М1 класу В в метод МР, в тілі методу М1 має бути тільки виклик методу МР, і в методі М2 замість М1 викликайте МР.

// це я так довго писав, що встиг 9 повідомлень пропустити.

Не звертайте уваги. Я думав що методи М1 і М2 - віртуальні, схоже помилився.

12

Re: Поліморфізьм влазить, куди не просять

:D