Материал предоставлен 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)

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

10 лет назад

Добрый день.

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

10 лет назад

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

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

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

10 лет назад

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

10 лет назад

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

Бывает.

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

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

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

10 лет назад

Задание 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”.

10 лет назад

Задание 3.

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

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


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

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

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

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

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

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

10 лет назад

Задание 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 уже имеет реализацию.

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

10 лет назад

Задание 5

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

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

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

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

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

10 лет назад

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

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

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

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