История изменений
Исправление 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 совпадают по типам.