1 Востаннє редагувалося funivan (01.10.2012 16:28:09)

Тема: Абстрактні класи (задача на 3+)

abstract class Robot {
     abstract public function turnLeft();
}

class RunRobot extends Robot{

}

Доповніть код таким чином що б у класі RunRobot  не було методу turnLeft() і код був валідний ;)

2

Re: Абстрактні класи (задача на 3+)

А так можна?

Хто хоче трохи подумати не дивіться

abstract class Robot {
     abstract public function turnLeft();
}

abstract class RunRobot extends Robot{

}

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

3

Re: Абстрактні класи (задача на 3+)

Можна можна =) Думаєм ))

4

Re: Абстрактні класи (задача на 3+)

funivan написав:
abstract class Robot {
     abstract public function turnLeft();
}

class RunRobot extends Robot{

}

Доповніть код таким чином що б у класі RunRobot  не було методу turnLeft() і код був валідний ;)

Та можна як завгодно доповнити, а на виході просто буде два валідних абстрактних класи. Чи потрібно щоб RunRobot став не абстрактний?
Наприклад:

// Валідний код
abstract class Robot {
     abstract public function turnLeft();
}

class RunRobot extends Robot{

}
$a = 1; $b = 2;
$a = $b;
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

5

Re: Абстрактні класи (задача на 3+)

Fatal error: Class RunRobot contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Robot::turnLeft) in /home/replace/public_html/learn/test2.php on line 9

6

Re: Абстрактні класи (задача на 3+)

А що значить, щоб не було методу?
Щоб коли викликати в екземпляру класу цей метод він матюкався?
Тоді просто перевизначіть метод і в тіло пропишіть виклик ручного виключення(custom exception).

7

Re: Абстрактні класи (задача на 3+)

Replace написав:
Fatal error: Class RunRobot contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Robot::turnLeft) in /home/replace/public_html/learn/test2.php on line 9

Я помилився)

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Чайник1

8

Re: Абстрактні класи (задача на 3+)

А що значить, щоб не було методу?

Я мав на увазі наступне. У класі RunRobot не має бути реалізовано методу turnLeft() Іншими словами згадки у класі RunRobot взагалі не має бути.

Прочитайте уважніше умову ;)

9

Re: Абстрактні класи (задача на 3+)

http://php.net/manual/en/language.oop5.abstract.php

When inheriting from an abstract class, all methods marked abstract in the parent's class declaration must be defined by the child;

Думаєте імплементація можлива? Я думаю ні.

10

Re: Абстрактні класи (задача на 3+)

Думаєте імплементація можлива? Я думаю ні.

Я знаю, пробував, і тестив код. Так це реально!

When inheriting from an abstract class, all methods marked abstract in the parent's class declaration must be defined by the child;

Я згідний але не можна взяти одне речення з розділу ООП. Існують правила, на тому ж таки сайті, які це правило обходять.

11

Re: Абстрактні класи (задача на 3+)

Vo_Vik так що там :) Не знайшли ще рішення ;)

12

Re: Абстрактні класи (задача на 3+)

це задача більше для тих хто вміє шукати в гуглі) чи я помиляюся? Я не знаю вирішення але думаю що тут просто треба знати (не вгадаєш) як обійти примусову реалізацію методу в похідному класі.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

13

Re: Абстрактні класи (задача на 3+)

А крім мого варіанту по іншому не можна? Google не використовув.

14

Re: Абстрактні класи (задача на 3+)

Я то написав, і більше не дивився... Добре гляну)

15

Re: Абстрактні класи (задача на 3+)

Все здаюсь, іншого рішення ніж Replace не знайшов.

16

Re: Абстрактні класи (задача на 3+)

Ще так можна, але не знаю чи за умовою можна проводити такі махінації.

if (1) {

class Robot {
}
    
} else {

abstract class Robot {
     abstract public function turnLeft();
}

}

class RunRobot extends Robot{

}

або так:

if (0) { // lol

abstract class Robot {
     abstract public function turnLeft();
}

class RunRobot extends Robot{

}

}

Останній варіант доречі зовсім не змінює шматок коду :)

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

17

Re: Абстрактні класи (задача на 3+)

Replace ти запропонував правильне рішення саме перше =) Мабуть умову трошки не так склав, з іфами така штука не передбачена ) У мене в IDE код підсвічується як не валідний але він робочий і рнршка пропускає його як нормальний) Ідея цікава дуже)

18

Re: Абстрактні класи (задача на 3+)

Статичний варіант:

Прихований текст

abstract class Robot {
  ?>   abstract public function turnLeft(); <?php
}
 
class RunRobot extends Robot{
}

Динамічний варіант (не зовсім відповідає вимогам - в класі є функція, але її нема в екземлярах)

Прихований текст

abstract class Robot {
     abstract public function turnLeft();
}
 
class RunRobot extends Robot{
  function turnLeft(){}
  function __construct() {
  undef($this->turnLeft);
  }
}

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

19

Re: Абстрактні класи (задача на 3+)

Якщо під словами

що б у класі RunRobot  не було методу turnLeft()

розуміти, що в оголошенні класу  RunRobot не повинен бути реалізовано метод turnLeft(), то Replace начебто ж правильну відповідь написав зразу. А якщо під цим розуміти: щоб в переліку класа RunRobot не повинно бути методу turnLeft(), то мабуть зробити його приватним.

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

20

Re: Абстрактні класи (задача на 3+)

RunRobot не повинен бути реалізовано метод turnLeft()

Саме це я мав на увазі ;)