2017-01-07 4 views
-1

Рассмотрение наследования Scala Я сталкиваюсь с непониманием.
Код:Объект подкласса Scala для назначения объектов суперкласса

sealed trait List[+A] // `List` data type, parameterized on a type, `A` 
case object Nil extends List[Nothing] // A `List` data constructor representing the empty list 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

object List { // `List` companion object. Contains functions for creating and working with lists. 
    def sum(ints: List[Int]): Int = ints match { // A function that uses pattern matching to add up a list of integers 
    case Nil => 0 // The sum of the empty list is 0. 
    case Cons(x,xs) => x + sum(xs) // The sum of a list starting with `x` is `x` plus the sum of the rest of the list. 
    } 

    def product(ds: List[Double]): Double = ds match { 
    case Nil => 1.0 
    case Cons(0.0, _) => 0.0 
    case Cons(x,xs) => x * product(xs) 
    } 

    def apply[A](as: A*): List[A] = // Variadic function syntax 
    if (as.isEmpty) Nil 
    else Cons(as.head, apply(as.tail: _*)) 
} 

val l1 = List(1.0, 2.0, 3.0) 
println(product(l1)) 

Насколько я понимаю, отношения между List[+A] и Cons[+A] том, что List[+A] супер «класс», Cons[+A] является подклассом List[+A].

l1 является примером Con[+A].
l1 передается в product метод, где входные параметры ds имеет тип List, который ничего не знает о его подклассе Cons.

Итак, вопрос в том, как объяснить объяснение объекта подкласса объекту суперкласса?

+1

's/к объекту суперкласса/параметру типа суперкласса /'. Есть ли у вас опыт работы с ООП? –

+0

Сторона примечания: 'case Cons (0.0, _) => 0.0' идет против IEEE-754. Контрпример - '0.0 * Double.NaN', который вычисляется как' Double.NaN'. – Jubobs

+0

@ Виктор Мороз, я думал, да. Но я здесь, потому что конкретный пример для меня не ясен. –

ответ

0

Дополнительные методы в Cons просто становятся скрытыми при назначении переменной типа List. Все Animal s могут двигаться (предположительно), но Cow, который extends Animal также дает молоко. Если вы присвоите объект типа Cow переменной типа Animal, вы можете позвонить только .move, но не .give_milk. Тем не менее, это все равно Cow.

 Смежные вопросы

  • Нет связанных вопросов^_^