Материал предоставлен https://it.rfei.ru

Вопрос по итоговой аттестации

Рассмотрим следующие 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)

Отметьте верные утверждения.

9 лет назад

Добрый день.

Прежде чем тратить еще одну попытку пересдачи, хотел бы проконсультироваться по ошибочно отвеченным вопросам (вроде того, что выше). Есть ли такая возможность?
После первой неудачной попытки я их старательно прорабатывал, привлекая различные источники, и готов приложить рассуждения.

9 лет назад

Добрый день,Игорь Рафаэлович.

Мы будем рады помочь. Излагайте.

С уважением,
Станислав Лахтин

9 лет назад

Мои размышления здесь: http://pastebin.com/13HiqzUJ

9 лет назад

Добрый день, Игорь.

Бывает.

Давайте рассмотрим подробно Ваши рассуждения.

Для удобства я буду выгружать их, сохраняя неизменным Ваш авторский текст, но семантически разметив его для наглядности.

Задание 1

Рассмотрим следующие 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)

Рассуждения и предположения

Отметьте верные утверждения:

  1. Поля класса Post неизменяемые. — НЕВЕРНО!

Почему: поля объявлены как 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]. Пояснения в этой главе: Пакеты и импорт

9 лет назад

Задание 2

Рассмотрим следующие определения

// Время
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)
  }

}

Отметьте верные утверждения:

  1. Класс Time расширяет Clock. - НЕВЕРНО!

Почему: Потому что Time более глобален, чем Clock, логично было бы наоборот

2. Класс Clock расширяет Watch. - НЕВЕРНО!

Почему: потому что верно обратное

3. Класс Clock расширяет Time. - НЕВЕРНО!

Почему: потому что это агрегирование, а не расширение

4. Класс Watch расширяет Clock. - ВЕРНО!

Почему: видно по записи: class Watch extends Clock

5. Отметьте корректные определения, расширяющие Clock:

  • Вариант 1: - НЕВЕРНО!

Почему: проверено в Eclipse

object StoppedWatch extends Watch {

  override def getTime = new Time(15, 20, 01)
}
  • Вариант 2: — ВЕРНО!

Почему: проверено в Eclipse

trait AlarmWatch extends Watch {

  def alarmTime: Time
}
  • Вариант 3: — НЕВЕРНО!

Почему: проверено в Eclipse

class AlarmWatch extends Watch {

 def alarmTime: Time
}
  • Вариант 4: — ВЕРНО!

Почему: проверено в Eclipse

abstract class AlarmClock(val alarmTime: Time)
  extends Clock
  • Вариант 5: — ВЕРНО!

Почему: проверено в Eclipse

trait AlarmWatch extends Watch {

  def alarmTime: Time
}

Заключение преподавателя

В целом, очень хорошо, что Вы проверяете код, но в технологию проверки, видимо, закралась ошибка. Если в первой части ответа у Вас нет ни одной осечки и видно понимание предмета, то в части, где Вы упоминаете о проверках Вы делаете одну ошибку в “Варианте 1”.

9 лет назад

Задание 3.

В этом задании я не смог понять требования ко мне( Поэтому отвечал едва ли не наугад...

С Вашего разрешения я удалю Ваши ответы. Они не имеют смысла, если Вы не поняли смысл задания. Прокомментирую только смысл заданий:


В примерах приведены два “типажа”: Polygon и RegularConvexNgon. Последний расширяет и, частично, реализует первый.

В первом вопросе спрашивается о том, какие методы обязан реализовать класс, чтобы расширить/реализовать типаж RegularConvexNgon.

Поскольку RegularConvexNgon уже частично реализует методы Polygon, то реализация требуется не для всех методов-членов.

Во-втором вопросе аналогичный вопрос касается Polygon. Поскольку, класс расширяющий Polygon не имеет ни одной реализации объявленных методов, то реализовывать их следует все.

Эти два вопроса на понимание принципа “расширения” и “замещения” функциональности.

В последнем Вашем варианте ошибка в “Вариант 2”. Почему и так очевидно.

9 лет назад

Задание 4

Рассмотрим следующее определение:

trait Product {

  def uuid = java.util.UUID.randomUUID.toString

  def name: String

  def description: String

  def price: BigDecimal

}

Какие методы необходимо реализовать конкретному классу, расширяющему Product?

  • annotation
  • title
  • description - ВЕРНО!
  • name - ВЕРНО!
  • author
  • price - ВЕРНО!
  • uuid - ВЕРНО!

Комментарий преподавателя

Неправильно. Ошибка: uuid уже имеет реализацию.

В оставшейся части задания Вы ошибок не допустили. Всё верно.

9 лет назад

Задание 5

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

Дело в том, что когда мы говорим о “ближайшем надтипе” для группы классов мы можем иметь в виду только одно: ближайший общий надтип для всех сразу. Не рассматривайте два или три класса в вариантах задания как перечисление, но как классы, организованные в единую иерархию.

Чтобы облегчить это задание в него внесены вспомогательные прилагательные.

Фуф. Вроде на всё ответил.

С уважением,
Станислав Лахтин

9 лет назад

Спасибо, Станислав!

Буду осознавать, уверен, теперь все сдастся гораздо лучше, Вы очень хорошо все расписали.

Ваш комментарий

Комментирование доступно только для авторизованных пользователей.