Re: Object.equals
От: gbear Россия  
Дата: 14.02.12 07:44
Оценка: -1
Здравствуйте, igna, Вы писали:

I>Отношение эквивалентности должно является рефлексивным, симметричным и транзитивным, но симметричным его похоже на Java сделать не удастся. То есть задача непротиворечива, но отсутствие мультиметодов делает ее решение невозможным.


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

Чем вас, при таком подходе, может спасти множественная диспетчеризация — я понять так и не смог... старый уже поди... тупею. Я жеж правильно понимаю, что симметричность вы тут согласны признать только тогда, когда "правильно" заработает метод Equal у экземпляра класса Object?

I>Если так, то вся эта сраная единая Java/.NET иерархия классов ущербна в самом своем корне.

А она-то тут каким боком?!
Re[2]: Object.equals
От: igna Россия  
Дата: 14.02.12 09:22
Оценка:
Здравствуйте, gbear, Вы писали:

G>Чем вас, при таком подходе, может спасти множественная диспетчеризация — я понять так и не смог... старый уже поди... тупею.


Поди.
Re[11]: String.equals
От: igna Россия  
Дата: 14.02.12 09:27
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>var myInstance = MyCollection.First(_ => MyComparerStaticClass.Compare(_, myValueToCompare));

0>Не?

Не.

Тут у тебя компаратор всегда один и тот же используется, независимо от типа сравниваемого объекта. Если задачу можно решить таким образом, то есть вообще без диспетчеризации, то и ООПа никакая не нужна.
Re[11]: String.equals
От: igna Россия  
Дата: 14.02.12 09:35
Оценка:
Здравствуйте, samius, Вы писали:

S>Тут возможны варианты. Вполне ожидаем был бы объект, реализующий IComparer.


А, ну да. Только этот объект уже ведь не ООП объект, а просто объект (как в C). С этим (не объектно-ориентированным) решением я поностью согласен.

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


Так долгое время генериков-то в Java не было, и использовали коллекцию объектов типа Object даже если нужна была коллекция объектов одного-единственного конкретного типа.

S>Нужно только что бы откипело желание ломать эквивалентность чего-либо, написанного не тобой (в том числе стандартных строк).


Вроде я уже говорил тебе, что String точно так же "ломает эквивалентность" Object, нет?
Re[12]: String.equals
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.02.12 09:44
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>А, ну да. Только этот объект уже ведь не ООП объект, а просто объект (как в C). С этим (не объектно-ориентированным) решением я поностью согласен.

Что такое просто объект и чем он отличается от ООП объекта?

I>Так долгое время генериков-то в Java не было, и использовали коллекцию объектов типа Object даже если нужна была коллекция объектов одного-единственного конкретного типа.

Если коллекция объектов одного типа, то известно как искать объект этого типа, его нельзя проверять на равенство с объектами любых других типов.

I>Вроде я уже говорил тебе, что String точно так же "ломает эквивалентность" Object, нет?

Я уже отвечал, что нет.
Re[13]: String.equals
От: igna Россия  
Дата: 14.02.12 09:50
Оценка:
Здравствуйте, samius, Вы писали:

S>Что такое просто объект и чем он отличается от ООП объекта?


Вот к примеру определение C:

object

region of data storage in the execution environment, the contents of which can represent values


Ну и вообще в смысле нормального русского языка как в предложении: "Субъект в темных очках взял объект под наблюдение."
Re[14]: String.equals
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.02.12 09:54
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>Вот к примеру определение C:


I>

I>region of data storage in the execution environment, the contents of which can represent values

Каким образом это определение исключает ООП объекты?
Re[3]: Object.equals
От: gbear Россия  
Дата: 14.02.12 09:58
Оценка:
Здравствуйте, igna, Вы писали:

G>>Чем вас, при таком подходе, может спасти множественная диспетчеризация — я понять так и не смог... старый уже поди... тупею.

I>Поди.

Ну дык просветите. Я правильно понимаю, что под симметричностью понимается не

когда "правильно" заработает метод Equal у экземпляра класса Object

, а что-то другое. Так? Тогда что именно?

Просто в .Net со всем остальным каноническое переопределение Equals/GetGashCode справляется. Вот примерно такое:

class EqualToTheObject
{
 private object _inner;
 
 ...

 /*
 * Проверки на null сознательно опущены
 */
 public bool Equals(EqualToTheObject obj)
 {
  return _inner.Equals(obj._inner);
 }

 public override bool Equals(object obj)
 {
   return _inner.Equals(obj);
 }

 public override int GetHashCode()
 {
  return _inner.GetHashCode();
 }
}


Мне просто реально интересно, что именно, если не Object.Equals — который честно будет возвращать false, если в него передавать экземпляр EqualToTheObject — ломает симметричность? И второй момент, каким образом, по вашему мнению, МД спасет от такого слома?
Re[15]: String.equals
От: igna Россия  
Дата: 14.02.12 10:00
Оценка:
Здравствуйте, samius, Вы писали:

S>Каким образом это определение исключает ООП объекты?


Оно их не исключает. Суть в том, что объекты в C есть, но поскольку C не является ОО-языком, то соответственно и объекты в нем не ООП объекты. Просто как пример того, что такие не-ООП объекты бывают.
Re[16]: String.equals
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.02.12 10:06
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, samius, Вы писали:


S>>Каким образом это определение исключает ООП объекты?


I>Оно их не исключает. Суть в том, что объекты в C есть, но поскольку C не является ОО-языком, то соответственно и объекты в нем не ООП объекты. Просто как пример того, что такие не-ООП объекты бывают.


Т.е. struct в C объектом не будет, а тот же самый struct в C++ станет объектом просто потому что C++ является ОО-языком? Или в C++ объектом считается то что class? Где таки граница? В расширении файла?
Re[4]: Object.equals
От: igna Россия  
Дата: 14.02.12 10:15
Оценка:
Здравствуйте, gbear, Вы писали:

G>Я правильно понимаю, что под симметричностью понимается не

G>когда "правильно" заработает метод Equal у экземпляра класса Object

G>, а что-то другое. Так? Тогда что именно?

Из a.Equals(b) следует b.Equals(a) и наоборот.

G>Мне просто реально интересно, что именно, если не Object.Equals — который честно будет возвращать false, если в него передавать экземпляр EqualToTheObject — ломает симметричность?


Ну если одновременно EqualToTheObject.Equals, если в него передавать экземпляр Object, будет возвращать true, то симметричность поломана.

G>И второй момент, каким образом, по вашему мнению, МД спасет от такого слома?


При выборе (в runtime) подходящего метода Equals будут учитываться типы обоих аргументов, соответственно, если хотя бы один из них окажется EqualToTheObject, будет выбран "мой новый" метод, а не тот, который есть в библиотеке.
Re[12]: String.equals
От: 0x7be СССР  
Дата: 14.02.12 10:17
Оценка:
Здравствуйте, igna, Вы писали:

I>Тут у тебя компаратор всегда один и тот же используется, независимо от типа сравниваемого объекта. Если задачу можно решить таким образом, то есть вообще без диспетчеризации, то и ООПа никакая не нужна.

Сказать по правде, мне ООПа с полиморфизмом в подобных вещах ещё ни разу не потребовалась
Re[17]: String.equals
От: igna Россия  
Дата: 14.02.12 10:18
Оценка:
Здравствуйте, samius, Вы писали:

S>Т.е. struct в C объектом не будет, а тот же самый struct в C++ станет объектом просто потому что C++ является ОО-языком? Или в C++ объектом считается то что class? Где таки граница? В расширении файла?


Не знаю, мне все-равно. Я только пример не-ООП объектов привел, на всякий случай.
Re[4]: Object.equals
От: icWasya  
Дата: 14.02.12 10:19
Оценка: 4 (1)
Здравствуйте, gbear, Вы писали:

G>Здравствуйте, igna, Вы писали:


G>>>Чем вас, при таком подходе, может спасти множественная диспетчеризация — я понять так и не смог... старый уже поди... тупею.

I>>Поди.

G>) Ну дык просветите. Я правильно понимаю, что под симметричностью понимается не

G>

G>когда "правильно" заработает метод Equal у экземпляра класса Object

G>, а что-то другое. Так? Тогда что именно?

G>Просто в .Net со всем остальным каноническое переопределение Equals/GetGashCode справляется. Вот примерно такое:


G>
 
G>class EqualToTheObject
G>{
G> private object _inner;
 
G> ...

G> /*
G> * Проверки на null сознательно опущены
G> */
G> public bool Equals(EqualToTheObject obj)
G> {
G>  return _inner.Equals(obj._inner);
G> }

G> public override bool Equals(object obj)
G> {
G>   return _inner.Equals(obj);
G> }

G> public override int GetHashCode()
G> {
G>  return _inner.GetHashCode();
G> }
G>}
G>


G>Мне просто реально интересно, что именно, если не Object.Equals — который честно будет возвращать false, если в него передавать

экземпляр EqualToTheObject — ломает симметричность? И второй момент, каким образом, по вашему мнению, МД спасет от такого слома?


кстати надо добавить


public bool Equals(EqualToTheObject obj)
{
 if (this == obj) return true;//<<==-- надо добавить
 return _inner.Equals(obj._inner);
}


Автор хочет сказать что

System.Button Button1 = new System.Button();
EqualToTheObject ETTO1 = new EqualToTheObject(Button1);
EqualToTheObject ETTO2 = new EqualToTheObject(Button1);

//тогда
  ETTO1.Equals(ETTO2) //=> true
  ETTO2.Equals(ETTO1) //=> true

  ETTO1.Equals(Button1) //=> true
  ETTO2.Equals(Button1) //=> true

//но несимметрично
  Button1.Equals(ETTO1) //=> false
  Button1.Equals(ETTO2) //=> false
Re[13]: String.equals
От: igna Россия  
Дата: 14.02.12 10:22
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Сказать по правде, мне ООПа с полиморфизмом в подобных вещах ещё ни разу не потребовалась


Да по правде сказать, она вообще не так уж часто бывает нужна.
Re[5]: Object.equals
От: gbear Россия  
Дата: 14.02.12 11:05
Оценка:
Здравствуйте, igna, Вы писали:

I>Из a.Equals(b) следует b.Equals(a) и наоборот.


Ну т.е. если допустить, что b — это экземпляр класса Object, то таки Object.Equals работает нарушая симметричность

G>>И второй момент, каким образом, по вашему мнению, МД спасет от такого слома?


I>При выборе (в runtime) подходящего метода Equals будут учитываться типы обоих аргументов, соответственно, если хотя бы один из них окажется EqualToTheObject, будет выбран "мой новый" метод, а не тот, который есть в библиотеке.


Это-то все понятно... что такое МД — я в курсе. Мне просто интересно, вы-то понимаете, что означает наличие такого "подходящего метода Equals" _в классе Object_, который, на минуточку, вообще-то предок EqualToTheObject, и ничего про него знать не должен?

По этому вам и говорят, что вы выдали крайне не удачное решение какой-то задачи, за саму задачу. И удивляетесь, что оно кривое.

Что мешает, например, переопределить ==/!= для EqualToTheObject? В этом случае с симметричностью проблем никаких.
Re[6]: Object.equals
От: igna Россия  
Дата: 14.02.12 11:09
Оценка:
Здравствуйте, gbear, Вы писали:

G>Мне просто интересно, вы-то понимаете, что означает наличие такого "подходящего метода Equals" _в классе Object_, который, на минуточку, вообще-то предок EqualToTheObject, и ничего про него знать не должен?


В том-то и дело, что он не в классе Object.
Re[14]: String.equals
От: 0x7be СССР  
Дата: 14.02.12 11:10
Оценка:
Здравствуйте, igna, Вы писали:

0>>Сказать по правде, мне ООПа с полиморфизмом в подобных вещах ещё ни разу не потребовалась

I>Да по правде сказать, она вообще не так уж часто бывает нужна.
Именно
Лично я на С# программирую в гибридном стиле, сочетающим ОО и функциональный подходы, причем в ОО-части я избегаю наследования реализации.
Интерфейсы — наше все

P.S. Я вообще, скорее, скептичести отношусь к ООП. Однако твоего революционного настроя в стиле "... на свалку!" не разделяю.
Re[18]: String.equals
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.02.12 12:05
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, samius, Вы писали:


S>>Т.е. struct в C объектом не будет, а тот же самый struct в C++ станет объектом просто потому что C++ является ОО-языком? Или в C++ объектом считается то что class? Где таки граница? В расширении файла?


I>Не знаю, мне все-равно. Я только пример не-ООП объектов привел, на всякий случай.

А по-моему было все немного по-другому.
1) Ты сказал что объект, реализующий IComparer — это не объект

Только этот объект уже ведь не ООП объект, а просто объект (как в C).


2) потом

Суть в том, что объекты в C есть, но поскольку C не является ОО-языком, то соответственно и объекты в нем не ООП объекты.


3) На вопрос об уточнении правил критерия для разных языков, ты говоришь что тебе все равно.

Т.е. ты выдвигаешь критерии, которыми сам не пользуешься. Объект, реализующий IComparer написан на C# (на ОО-языке), но ты его назвал "просто объектом", а не ОО. С другой стороны, твой критерий не позволяет узнать, является ли struct объектом, без знания расширения файла.

Давай-ка соберись, и возьми где-нибудь свои слова обратно.
Re[19]: String.equals
От: igna Россия  
Дата: 14.02.12 12:13
Оценка:
Здравствуйте, samius, Вы писали:

S>Давай-ка соберись, и возьми где-нибудь свои слова обратно.


Да я вообще все заберу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.