Здравствуйте, <Аноним>, Вы писали:
А>Мне тут вопрос задали — для чего нужно, что бы все объеты наследовались от Object'a? А>Я ответил — что бы можно было любые два объекта сравнить методом Equal(). А>Я прав? Что ещё можно дополнить сюда?
Собственно:
* распределение памяти
* работа с GC
* подсчет ссылок и все такое
... << RSDN@Home 1.2.0 alpha rev. 0>>
для чего нужно, что бы все объеты наследовались от Object'a?
Здравствуйте, <Аноним>, Вы писали:
А>Мне тут вопрос задали — для чего нужно, что бы все объеты наследовались от Object'a? А>Я ответил — что бы можно было любые два объекта сравнить методом Equal(). А>Я прав? Что ещё можно дополнить сюда?
Я бы сказал, что в первую очередь это возможность строить обобщенные коллекции, в которые можно складывать объекты любых типов. К ним добавить такие же перечислители, методы и можно выводить такие же обобщенные алгоритмы...
(генерики во многих случаях решают проблему лучше, но они не всегда были, да и они не решают проблему складывания в одну коллекцию объектов различных типов, которая время от времени да возникает).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
для чего нужно, что бы все объеты наследовались от Object'a?
Это нужно дя глобальной поддержки полиморфизма всеми типами .NET. Это главнои и отсюда вытекает все остальное.
Также в object содержаться наследуемые всеми типами методы, public: кроме Equals есть еще несколько:
[Serializable, ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class Object
{
// Methods
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public Object();
public virtual bool Equals(object obj);
public static bool Equals(object objA, object objB);
private void FieldGetter(string typeName, string fieldName, ref object val);
private void FieldSetter(string typeName, string fieldName, object val);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
protected override void Finalize();
private FieldInfo GetFieldInfo(string typeName, string fieldName);
public virtual int GetHashCode();
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Type GetType(); // для поддержки ad hoc полиморфизма, в частности
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool InternalEquals(object objA, object objB);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int InternalGetHashCode(object obj);
[MethodImpl(MethodImplOptions.InternalCall)]
protected extern object MemberwiseClone();
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static bool ReferenceEquals(object objA, object objB);
public virtual string ToString();
}
А>Мне тут вопрос задали — для чего нужно, что бы все объеты наследовались от Object'a?
А>Я ответил — что бы можно было любые два объекта сравнить методом Equal().
Да. И ещё вызывать ToString() )
Да бог их знает, зачем они нужны... Как говорят на том же csharp-station, "I believe the practice of using the object class for generic routines will be replaced in many future scenarios by the use of Generics in C# v2.0". А если взять чистый ООЯ, да не заниматься тупизмом типа reflection, то можно вообще этот object не вводить, а использовать везде абстрактную "ссылку на класс".