Использование методов класса object (Объект) в классе Customer (Клиент)
Для иллюстрации описанных методов рассмотрим класс Customer (Клиент) до и после перегрузки методов Equals (Равняется), ToString и GetHashCode.
Стандартные методы класса object (Объект)
Если не произвести подмены виртуальных методов объекта Object (Объект), наш класс будет наследовать стандартное поведение. Это поведение продемонстрировано в CustomsrObjectXStepl.
//Customer.срр
#using <mscorlib.dll>
using namespace System;
// использование пространства имен Система;
#include "Customer.h"
//Customer.h
_gc class Customer // сборщик мусора - класс Клиент
{
public:
int nCustomerld;
String *pFirstName;
String *pLastName;
String *pEmailAddress;
Customer(int id. String *pFirst, // Клиент (int идентификатор,
// Строка *pFirst, String *pLast, String *eMail)
{
nCustomerld = id; // идентификатор
pFirstName = pFirst;
pLastName = pLast;
pEmailAddress = eMail; // электронная почта
}
};
//TestCustomer.срр
ftusing <mscorlib.dll>
using namespace System;
// использование пространства имен Система;
#include "Customer.h"
#include "TestCustomer.h"
void main(void)
{
TestCustomer::Main(); // Главный }
//TestCustomer.h
_gc class TestCustomer
// класс сборщика мусора TestCustomer
{
public:
static void Main() // статическая Главная
{
Customer *pCustl, *pCust2; // Клиент
pCustl = new Customer ( // новый Клиент
99, "John", "Doe", "john@rocky.com"); // "Джон", "Доу"
pCust2 = new Customer( // новый Клиент
99, "John", "Doe", "john@rocky.com"); // "Джон", "Доу"
ShowCustomerObject("pCustl", pCustl);
ShowCustomerObject("pCust2", pCust2);
CompareCustomerObjects(pCustl, pCust2);
}
private: // частный
static void ShowCustomerObject( String *pLabel, Customer *pCust)
{
Console::WriteLine("——— {0} ——", pLabel);
Console::WriteLine(
"ToStringO = {0}", pCust->ToString());
Console::WriteLine(
"GetHashCodeO = {0}", _box(pCust->GetHashCode() ) ) ;
Console::WriteLine(
"GetTypeO = {0}", pCust->GetType () ) ;
}
static void CompareCustomerObjects( Customer *pCustl, Customer *pCust2) // Клиенты
{
Console::WriteLine(
"Equals() = {0}", // Равняется
_box(pCustl->Equals( // Равняется
dynamic_cast<0b]ect _gc *>(pCust2)))); // сборщик
// мусора
}
};
Запустите испытательную программу, и вы получите следующий результат:
——— custl ——— // ———custl ———
ToString () = Customer // ToString () = Клиент
GetHashCode () = 4 // GetHashCode () = 4
GetType () = Customer // GetType () = Клиент
——— cust2 ——— // ———cust2 ———
ToString () = Customer // ToString () = Клиент
GetHashCode () = 6 // GetHashCode () = 6
GetType () = Customer // GetType () = Клиент
Equals() = False // Равняется () = Ложь
Понятно, что реализация, принятая по умолчанию, — это совсем не то, что желательно иметь для объекта Customer (Клиент). Метод ToString возвращает имя класса, а не информацию о конкретном клиенте. Метод Equals (Равняется) сравнивает только указатели на объекты, а не сами объекты. В приведенном примере два разных указателя указывают на одинаковые (по содержащейся информации) объекты класса Customer (Клиент), но метод Equals (Равняется) при этом возвращает значение false (ложь).
Подмена методов класса object (Объект)
Версия проекта, содержащаяся в папке CustomerOb;ject\Step2, демонстрирует подмену виртуальных методов Ob] ect (Объект)
//Customer.h
_gc class Customer
// сборщик мусора - класс Клиент
{
public:
int nCustomerld;
String *pFirstName,
String *pLastName;
String *pEmailAddress;
Customer(int id, String *pFirst, // Клиент int идентификатор,
// Строка *pFirst, String *pLast, String *eMail)
{
nCustomerId = id; // идентификатор
pFirstName = pFirst;
pLastName = pLast;
pEmailAddress = eMail; // электронная почта
}
public:
bool Equals(Object *pobj)
// логический (булев) Равняется (Объект *pobj)
{
Customer *pCust = // Клиент
dynamic_cast<Customer *>(pob]);
return (pCust->nCustomerId == nCustomerld),
}
int GetHashCode()
{
return nCustomerld,
}
String *ToStnng()
{
return String::Format( // Формат
"{0} {l}", pFirstName, pLastName);
}
};
Остальная часть программы не изменена Теперь результат выполнения программы будет таким:
--- custl --- // ---custl---
ToStnng () = John Doe // ToString () = Джон Доу
GetHashCode () = 99 // GetHashCode () = 99
GetTypeO = Customer // GetType () = Клиент
--- cust2 --- // --- cust2 ---
ToString () = John Doe // ToString () = Джон Доу
GetHashCode () = 99 // GetHashCode () = 99
GetType () = Customer // GetType () = Клиент
Equals () = True // Равняется () = Истина
CompEbook.ru Железо, дизайн, обучение и другие