Возможно, это больше вроде того, что Вы пропускаете:
, Если Вы происходите из C++ как точка зрения, делегаты берут немного привыкающее к - но в основном 'они просто работают'.
способ, которым это работает, состоит в том, что Вы устанавливаете некоторый объект, который Вы записали как делегат в NSWindow, но Ваш объект только имеет реализации (методы) для одного или нескольких из многих возможных методов делегата. Таким образом, что-то происходит, и NSWindow
хочет назвать Ваш объект - он просто использует Цель-c's respondsToSelector
метод, чтобы определить, хочет ли Ваш объект тот метод, названный, и затем называет его. Это - то, как объективные-c работы - методы ищутся по требованию.
Это полностью тривиально, чтобы сделать это с Вашими собственными объектами, нет ничего специального продолжения, Вы могли, например, иметь NSArray
из 27 объектов, все различные виды объектов, только 18 некоторые из них имеющий метод -(void)setToBue;
, другие 9 не делают. Таким образом для вызова setToBlue
на всех из 18, которым нужен в сделанный, что-то вроде этого:
for (id anObject in myArray)
{
if ([anObject respondsToSelector:@selector(@"setToBlue")])
[anObject setToBlue];
}
другая вещь о делегатах состоит в том, что они не сохраняются, таким образом, всегда необходимо устанавливать делегата в nil
в Вашем MyClass dealloc
метод.
Либо создайте огромный прокси-класс, либо откажитесь от него и потребуйте, чтобы клиент устранял неоднозначность:
100.asInstanceOf [String] .length
У меня нет решения, но я прокомментирую, что причина RichString
методов недоступна после вашего intToString
неявно заключается в том, что Scala не поддерживает цепочка неявных вызовов (см. 21.2 «Правила для имплицитов» в Программирование в Scala ).
Если вы введете промежуточную String
, Scala выполнит неявное преобразование в RichString
(этот неявный определен в Predef.scala
).
Например,
$ scala
Welcome to Scala version 2.7.5.final [...].
Type in expressions to have them evaluated.
Type :help for more information.
scala> implicit def intToString(i: Int) = String.valueOf(i)
intToString: (Int)java.lang.String
scala> val i = 100
i: Int = 100
scala> val s: String = i
s: String = 100
scala> s.reverse
res1: scala.runtime.RichString = 001
Единственный вариант, который я вижу, - это создать новый String Wrapper class MyString и позвольте этому вызывать любой метод, который вы хотите вызвать в неоднозначном случае. Затем вы можете определить неявные преобразования в MyString и два неявных преобразования из MyString в String и RichString, на всякий случай, если вам нужно передать их в библиотечную функцию.
I'm confused: can't you use .toString
on any type anyway thus avoiding the need for implicit conversions?