Рассмотрим следующие Scala-файлы.
Файл blog.scala
:
package com.myblog
package model
class Blog(var title: String) {
protected val _posts: ListBuffer[Post]
def feed = _posts.toSeq.sortBy(_.date).reverse
def publish(post: Post) {
_posts += post
post.date = new Date
}
}
Файл post.scala
:
package com.myblog
package model
class Post(var text: String,
var date: Date)
Отметьте верные утверждения.
Добрый день.
Прежде чем тратить еще одну попытку пересдачи, хотел бы проконсультироваться по ошибочно отвеченным вопросам (вроде того, что выше).
Есть ли такая возможность?
После первой неудачной попытки я их старательно прорабатывал, привлекая различные источники, и готов приложить рассуждения.
Добрый день,Игорь Рафаэлович.
Мы будем рады помочь. Излагайте.
С уважением,
Станислав Лахтин
Мои размышления здесь: http://pastebin.com/13HiqzUJ
Добрый день, Игорь.
Бывает.
Давайте рассмотрим подробно Ваши рассуждения.
Для удобства я буду выгружать их, сохраняя неизменным Ваш авторский текст, но семантически разметив его для наглядности.
Рассмотрим следующие Scala-файлы:
Файл blog.scala
package com.myblog
package model
class Blog(var title: String) {
protected val _posts: ListBuffer[Post]
def feed = _posts.toSeq.sortBy(_.date).reverse
def publish(post: Post) {
_posts += post
post.date = new Date
}
}
Файл post.scala
package com.myblog
package model
class Post(var text: String,
var date: Date)
Рассуждения и предположения
Отметьте верные утверждения:
Почему: поля объявлены как var
2. “Класс Post расширяет класс Blog.”, “Класс Blog
расширяет класс Post
.” - НЕВЕРНО!
Почему: это агрегирование, а не расширение.
3. Класс Post неизменяемый. - НЕВЕРНО!
Почему: поля объявлены как var
4. Классы пакета com.myblog
видны в обоих файлах. - НЕВЕРНО!
Почему: виден только com.myblog.model
, в соответствии с директивой.
5. Класс Blog неизменяемый. - НЕВЕРНО!
Почему: для этого все поля должны быть неизменяемые, но (var title: String)
- поле является изменяемым.
6. Поля класса Blog неизменяемые. - НЕВЕРНО!
Почему: (var title: String)
- поле является изменяемым.
7. Классы пакета com.myblog.model
видны в обоих файлах. - ВЕРНО!
Почему: директиву package com.myblog.model
допустимо записывать и так:
package com.myblog
package model
Ход Ваших рассуждений верен, за исключением ответа под номером [4]. Пояснения в этой главе: Пакеты и импорт
Рассмотрим следующие определения
// Время
class Time(val hours: Int,
val minutes: Int,
val seconds: Int)
// Часы
trait Clock {
// Текущее время
def getTime: Time
}
// Наручные часы
class Watch extends Clock {
def getTime = {
val secs = System.currentTimeMillis / 1000l
val seconds = secs % 60
val minutes = (secs / 60) % 60
val hours = (secs / 3600) % 24
new Time(hours.toInt, minutes.toInt, seconds.toInt)
}
}
Отметьте верные утверждения:
Time
расширяет Clock
. - НЕВЕРНО!
Почему: Потому что Time
более глобален, чем Clock
, логично было бы наоборот
2. Класс Clock
расширяет Watch
. - НЕВЕРНО!
Почему: потому что верно обратное
3. Класс Clock
расширяет Time
. - НЕВЕРНО!
Почему: потому что это агрегирование, а не расширение
4. Класс Watch
расширяет Clock
. - ВЕРНО!
Почему: видно по записи: class Watch extends Clock
5. Отметьте корректные определения, расширяющие Clock
:
Почему: проверено в Eclipse
object StoppedWatch extends Watch {
override def getTime = new Time(15, 20, 01)
}
Почему: проверено в Eclipse
trait AlarmWatch extends Watch {
def alarmTime: Time
}
Почему: проверено в Eclipse
class AlarmWatch extends Watch {
def alarmTime: Time
}
Почему: проверено в Eclipse
abstract class AlarmClock(val alarmTime: Time)
extends Clock
Почему: проверено в Eclipse
trait AlarmWatch extends Watch {
def alarmTime: Time
}
В целом, очень хорошо, что Вы проверяете код, но в технологию проверки, видимо, закралась ошибка. Если в первой части ответа у Вас нет ни одной осечки и видно понимание предмета, то в части, где Вы упоминаете о проверках Вы делаете одну ошибку в “Варианте 1”.
В этом задании я не смог понять требования ко мне( Поэтому отвечал едва ли не наугад...
С Вашего разрешения я удалю Ваши ответы. Они не имеют смысла, если Вы не поняли смысл задания. Прокомментирую только смысл заданий:
В примерах приведены два “типажа”: Polygon
и RegularConvexNgon
. Последний расширяет и, частично, реализует первый.
В первом вопросе спрашивается о том, какие методы обязан реализовать класс, чтобы расширить/реализовать типаж RegularConvexNgon
.
Поскольку RegularConvexNgon
уже частично реализует методы Polygon
, то реализация требуется не для всех методов-членов.
Во-втором вопросе аналогичный вопрос касается Polygon
. Поскольку, класс расширяющий Polygon
не имеет ни одной реализации объявленных методов, то реализовывать их следует все.
Эти два вопроса на понимание принципа “расширения” и “замещения” функциональности.
В последнем Вашем варианте ошибка в “Вариант 2”. Почему и так очевидно.
Рассмотрим следующее определение:
trait Product {
def uuid = java.util.UUID.randomUUID.toString
def name: String
def description: String
def price: BigDecimal
}
Какие методы необходимо реализовать конкретному классу, расширяющему Product
?
Неправильно. Ошибка: uuid
уже имеет реализацию.
В оставшейся части задания Вы ошибок не допустили. Всё верно.
Я оставил за собой возможность удалить Ваши ответы, потому что здесь важно не их перечисление, а небольшое пояснение, которое сделает выполнение этого задания намного легче.
Дело в том, что когда мы говорим о “ближайшем надтипе” для группы классов мы можем иметь в виду только одно: ближайший общий надтип для всех сразу. Не рассматривайте два или три класса в вариантах задания как перечисление, но как классы, организованные в единую иерархию.
Чтобы облегчить это задание в него внесены вспомогательные прилагательные.
Фуф. Вроде на всё ответил.
С уважением,
Станислав Лахтин
Спасибо, Станислав!
Буду осознавать, уверен, теперь все сдастся гораздо лучше, Вы очень хорошо все расписали.