Menu
CoddyTech

“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() 等方法。

challenge icon

挑战

简单

让我们构建一个图书比较系统,演示如何重写 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}"
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器