LINUX.ORG.RU

История изменений

Исправление AndreyKl, (текущая версия) :

Проблема в том, что теперь любой объект из любого модуля, у которого определена функция Hello, считается реализующим интерфейс AFoo. Даже если та функция Hello по смыслу имеет в виду совершенно другое.

О, зело «интересное» решение. По-моему, конечно.

Может тебя наведёт на мысли: в скале можно добавлять методы в класс.

Скажем, есть у нас класс (псевдокод)

class MyClass
  method1: MyType
  method2: MyType



и мы в другом совершенно месте программы, даже не имея исходников MyClass, можем сделать так:

object Helpers {
  implicit class MyClassWithMethod3(myCl: MyClass) {
    def method3(): Unit = {
      myCl.method2()
      println("executed method2 and printed this message")
    }
  }
}


после чего импортируем Helpers._ можем писать код вроде
import Helpers._

MyClass obj = new MyClass
obj.method3()


Скала при этом неявно сделает необходимые преобразования. А программист работает с классом MyClass так как будто он имеет метод method3, хотя в оригинальном исходном коде MyClass method3 отсутствует.

Преобразование будет работать только там где сделан import Helpers._

---------

В хаскеле не то что бы имя hello относится к модулю. Если ты банально импортируешь два модуля с одинаковыми функциями то при вызове возникнет конфликт имёт. Эта ситуация простая, решается переименованием при импорте как я показал выше.

Но реализация указанной задачи - сделать свой тип представителем некоторого интерфейса (скажем интерфейс AFoo содержи функцию hello) тоже решается: просто указыаешь что твой класс является инстансом AFoo, при этом ты можешь указать свою реализацию hello, а можешь использовать дефолтную от класса AFoo (если таковая предоставляется классом AFoo):
instance MyClass AFoo where
  hello = println "hello from MyClass"


instance MyClass AFoo -- используем реализацию по умолчанию


Понятное дело, что если кто то где то в каком то классе (ClassB) определил ф-цию hello то этот класс не считается представителем AFoo пока явно не объявишь ClassB представителем AFoo. И использовать ClassB вместо представителя AFoo без объявления представителем не получится, даже если их ф-ции hello совпадают по типам.

Исправление AndreyKl, :

Проблема в том, что теперь любой объект из любого модуля, у которого определена функция Hello, считается реализующим интерфейс AFoo. Даже если та функция Hello по смыслу имеет в виду совершенно другое.

О, зело «интересное» решение. По-моему, конечно.

Может тебя наведёт на мысли: в скале можно добавлять методы в класс.

Скажем, есть у нас класс (псевдокод)

class MyClass
  method1: MyType
  method2: MyType



и мы в другом совершенно месте программы, даже не имея исходников MyClass, можем сделать так:

object Helpers {
  implicit class MyClassWithMethod3(myCl: MyClass) {
    def method3(): Unit = {
      myCl.method2()
      println("executed method2 and printed this message")
    }
  }
}


после чего импортируем Helpers._ можем писать код вроде
import Helpers._

MyClass obj = new MyClass
obj.method3()


Скала при этом неявно сделает необходимые преобразования. А программист работает с классом MyClass так как будто он имеет метод method3, хотя в оригинальном исходном коде MyClass method3 отсутствует.

Преобразование будет работать только там где сделан import Helpers._

---------

В хаскеле не то что бы имя hello относится к модулю. Если ты банально импортируешь два модуля с одинаковыми функциями то при вызове возникнет конфликт имёт. Эта ситуация простая, решается переименованием при импорте как я показал выше.

Но реализация указанной задачи - сделать свой тип представителем некоторого интерфейса (скажем интерфейс AFoo содержи функцию hello) тоже решается: просто указыаешь что твой класс является инстансом AFoo, при этом ты можешь указать свою реализацию hello, а можешь использовать дефолтную от класса AFoo (если таковая предоставляется классом AFoo):
instance MyClass AFoo where
  hello afoo = println "hello from MyClass"


instance MyClass AFoo -- используем реализацию по умолчанию


Понятное дело, что если кто то где то в каком то классе (ClassB) определил ф-цию hello то этот класс не считается представителем AFoo пока явно не объявишь ClassB представителем AFoo. И использовать ClassB вместо представителя AFoo без объявления представителем не получится, даже если их ф-ции hello совпадают по типам.

Исходная версия AndreyKl, :

Проблема в том, что теперь любой объект из любого модуля, у которого определена функция Hello, считается реализующим интерфейс AFoo. Даже если та функция Hello по смыслу имеет в виду совершенно другое.

О, зело «интересное» решение. По-моему, конечно.

Может тебя наведёт на мысли: в скале можно добавлять методы в класс.

Скажем, есть у нас класс (псевдокод)

class MyClass
  method1: MyType
  method2: MyType



и мы в другом совершенно месте программы, даже не имея исходников MyClass, можем сделать так:

object Helpers {
  implicit class MyClassWithMethod3(myCl: MyClass) {
    def method3(): Unit = {
      myCl.method2()
      println("executed method2 and printed this message")
    }
  }
}


после чего импортируем Helpers._ можем писать код вроде
import Helpers._

MyClass obj = new MyClass
obj.method3()


Скала при этом неявно сделает необходимые преобразования. А программист работает с классом MyClass так как будто он имеет метод method3, хотя в оригинальном исходном коде MyClass method3 отсутствует.

Преобразование будет работать только там где сделан import Helpers._

---------

В хаскеле не то что бы имя hello относится к модулю. Если ты банально импортируешь два модуля с одинаковыми функциями то при вызове возникнет конфликт имёт. Эта ситуация простая, решается переименованием при импорте как я показал выше.

Но реализация указанной задачи - сделать свой тип представителем некоторого интерфейса (скажем интерфейс AFoo содержи функцию hello) тоже решается: просто указыаешь что твой класс является инстансом AFoo, при этом ты можешь указать свою реализацию hello, а можешь использовать дефолтную от класса AFoo (если таковая предоставляется классом AFoo):
instance MyClass AFoo where
  hello = println "hello"


instance MyClass AFoo -- используем реализацию по умолчанию


Понятное дело, что если кто то где то в каком то классе (ClassB) определил ф-цию hello то этот класс не считается представителем AFoo пока явно не объявишь ClassB представителем AFoo. И использовать ClassB вместо представителя AFoo без объявления представителем не получится, даже если их ф-ции hello совпадают по типам.