Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы C#.doc
Скачиваний:
58
Добавлен:
10.02.2015
Размер:
430.59 Кб
Скачать

Основы c#. Урок 40. Класс System.Object

Класс System.Object является предком для всех классов. Это происходит неявным образом - при объявлении класса мы System.Object не указываем в качестве класса предка. Хотя это и можно сделать (результат будет одним и тем же):

class Test:System.Object

{

...

}

То, что все классы являются потомками класса System.Object, позволяет нам использовать методы последнего.

Еще одно из следствий этого - это возможность записать в переменную типа System.Object экземпляр любого класса:

//Некоторый класс.

classTest

{

public string s;

}

class App

{

static void Main()

{

Object ob;

//Записываем в ob экземпляр класса-потомка Test.

ob=new Test();

//Приводим ob к типу Test.

((Test)ob).s="some string";

//Выводим значение поля s.

Console.WriteLine(((Test)ob).s);

}

}

Указанный фрагмент выведет, естественно, строку "some string".

Основы c#. Урок 41. Методы класса System.Object

В классе System.Object имеются следующие методы:

  • Equals - виртуальный метод, возвращающий True, если два объекта расположены в одном месте памяти (второй объект передается в качестве параметра).

  • GetHashCode - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса.

  • GetType - возвращает объект типа Type, описывающий соответствующий тип.

  • ToString - виртуальный метод, по умолчанию возвращает строку, представляющую полное имя типа объекта.

Вот пример использования этих методов:

Object ob1, ob2;

ob1=new System.Object();

ob2=ob1;

//Выведется True.

Console.WriteLine(ob1.Equals(ob2));

ob2=new System.Object();

//Выведется False.

Console.WriteLine(ob1.Equals(ob2));

//Выведется некотрое число.

Console.WriteLine(ob1.GetHashCode());

//Выведется System.Object.

Console.WriteLine(ob1.GetType());

//Выведется System.Object.

Console.WriteLine(ob1.ToString());

Виртуальные методы класса System.Object часто переписывают в классах-потмках.

Основы c#. Урок 42. Переопределяем методы класса System.Object

Часть методов класса System.Object, рассмотренных на прошлом уроке, были виртуальными. Это значит, что мы можем переписать их в классе-потомке. Давайте для примера перепишем в нашем классе Vector метод ToString так, чтобы он возвращал не имя класса, а координаты вектора в красивом виде. Это будет выглядеть вот так:

class Vector

{

public float x, y; //Координаты.

//Переопределяем метод ToString.

public override string ToString()

{

return "x = " + x +", y = " + y;

}

}

//Тестовый класс.

classApp

{

static void Main()

{

Vector v=new Vector();

v.x=2;

v.y=3;

//Выводим координаты вектора.

Console.WriteLine(v.ToString());

}

}

А в следующем примере мы переопределим виртуальный метод Equals таким образом, чтобы считать равными два вектора с одинаковой длиной (вспомним теорему Пифагора):

classVector

{

...

//Переопределяем метод Equals.

public override bool Equals(object ob)

{

Vector t=(Vector)ob;

return (t.x*t.x+t.y*t.y)==(this.x*this.x+this.y*this.y);

}

}

//Тестовый класс.

classApp

{

static void Main()

{

Vector v1=new Vector();

v1.x=2;

v1.y=3;

Vector v2=new Vector();

v2.x=-3;

v2.y=2;

Console.WriteLine(v1.Equals(v2));

}

}

В тестовом классе мы проверяем действие переопределенного метода для равных по длине векторов (2, 3) и (-3, 2). Указанный фрагмент выведет True.