“object”基类
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 23 课,共 70 课。
在 C# 中,你创建的每个类都会自动继承一个名为 object 的特殊类。即使你没有明确指定基类,你的类仍然以 object 为最终祖先。这意味着 C# 中的每种类型都共享一组相同的方法。
object 类提供了几个虚方法,你可以在自己的类中重写这些方法:
public class Person
{
public string Name { get; set; }
// 重写从 object 继承的方法
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}最常被重写的三个方法是:用于表示字符串的 ToString()、用于比较对象的 Equals(),以及用于基于哈希的集合的 GetHashCode()。默认情况下,ToString() 会返回类型名称,而 Equals() 会检查引用是否相等。
因为所有内容都继承自 object,所以你可以在 object 变量中存储任何类型的值:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: Alice这个通用基类让能够存放混合类型的集合等功能成为可能,也正因如此,C# 中的每个对象都可以使用 ToString() 和 GetType() 等方法。
挑战
简单让我们构建一个图书比较系统,演示如何重写 object 基类中的方法,让自定义类型在字符串表示和相等性检查方面具有实际意义。
你将创建两个文件来组织代码:
Book.cs:在Library命名空间中定义一个Book类。你的书应包含Title(字符串)和Author(字符串)属性,以及一个用于设置这两个值的构造函数。重写从object继承的三个关键方法:ToString()应返回"{Title} by {Author}"- 如果另一个对象是
Book,并且它的Title和Author与当前对象相同,Equals(object obj)应返回true GetHashCode()应组合两个属性的哈希码
Program.cs:在主文件中,使用输入值创建两本书。使用ToString()显示每本书,然后检查它们是否相等并打印结果。最后,演示如何将一个Book存储在object变量中,并在调用ToString()时仍然获得有意义的输出。
你将收到 4 个输入:
- 第一本书的书名
- 第一本书的作者
- 第二本书的书名
- 第二本书的作者
请按以下格式打印输出:
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}例如,如果输入是 1984、George Orwell、1984 和 George Orwell,输出应为:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George Orwell如果输入是 1984、George Orwell、Brave New World 和 Aldous Huxley,输出应为:
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George Orwell注意,重写的方法让 Book 对象具有了实际意义:它们可以显示为格式良好的字符串,还能按内容而非内存引用进行比较!
亲手试试
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// 读取两本书的输入信息
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO:用输入的值创建两个 Book 对象
// TODO:用 ToString() 输出 Book 1
// 格式:"Book 1: {ToString result}"
// TODO:用 ToString() 输出 Book 2
// 格式:"Book 2: {ToString result}"
// TODO:检查两本书是否相等,并输出结果
// 格式:"Are they equal? {True/False}"
// TODO:将第一本书存入 object 变量并输出
// 格式:"Stored as object: {ToString result}"
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器