【C#入门超简单】面向对象

面向对象编程(OOP)就像是在编程世界里建造一个小社会,其中的每个对象都是社会中的一个成员,具有自己的特征和行为。这里的“类”就像是一个制造对象的模具,而“对象”则是根据这个模具制造出来的具体实体。

类和对象

  • :就像是一个制造蓝图,告诉我们一个对象应该具备哪些特征和能做哪些事情。
  • 对象:是根据类的蓝图制造出来的实体,比如根据“汽车类”的蓝图,我们可以制造出很多具体的汽车。

属性和方法

  • 属性:对象的特征,比如汽车的颜色、型号等。
  • 方法:对象能够执行的动作,比如汽车可以启动、停止。

封装、继承和多态

  • 封装:把对象的详细情况包装起来,外部只能看到有限的信息,这样可以保护对象的数据不被随意修改。
  • 继承:就像孩子可以继承父母的特征一样,一个新的类可以继承一个已有类的特征和行为,同时还可以有自己的一些特别之处。
  • 多态:不同的对象,可以用相同的方式进行操作,但表现出来的行为却各不相同。比如父亲和儿子都有说话的功能,但说话的内容和声音是不一样的。

构造函数和析构函数

  • 构造函数:就像给新生儿取名字和设定基本信息一样,构造函数在创建对象时设置对象的基本信息。
  • 析构函数:当对象不再被需要时,析构函数就像是进行清理工作,确保对象离开时不会留下任何麻烦。

示例解释

假设我们有一个图书馆系统,我们可以定义一个“书”类,每本书都有标题、作者和出版年份等属性,还有显示信息的方法。图书馆里可以有很多书,我们可以用一个“图书馆”类来管理这些书,比如添加新书或显示所有书的信息。

在下面的代码中,我将添加详细的注释来解释每个部分的功能和目的,以便更好地理解面向对象编程的概念和实现。

using System;
using System.Collections.Generic;

// 定义一个公共类 Book,代表书籍对象
public class Book
{
    // 定义私有属性,外部不能直接访问,只能通过构造函数和方法访问
    public string Title { get; private set; }  // 书的标题
    public string Author { get; private set; } // 书的作者
    public int YearPublished { get; private set; } // 书的出版年份

    // 构造函数:在创建 Book 对象时调用,用于初始化对象的属性
    public Book(string title, string author, int yearPublished)
    {
        Title = title; // 设置标题
        Author = author; // 设置作者
        YearPublished = yearPublished; // 设置出版年份
    }

    // 公共方法:用于显示书籍的详细信息
    public void DisplayInfo()
    {
        Console.WriteLine($"{Title}, written by {Author}, published in {YearPublished}.");
    }

    // 析构函数:在对象被销毁时调用,用于执行清理操作
    ~Book()
    {
        Console.WriteLine("Book destructor called.");
    }
}

// 定义一个公共类 Library,代表图书馆,用于管理书籍
public class Library
{
    // 定义一个私有的 List 集合,用于存储 Book 对象
    private List<Book> books = new List<Book>();

    // 公共方法:用于向图书馆添加书籍
    public void AddBook(Book book)
    {
        books.Add(book); // 将书籍添加到列表中
    }

    // 公共方法:用于显示图书馆中所有书籍的信息
    public void DisplayAllBooks()
    {
        foreach (var book in books) // 遍历图书馆中的所有书籍
        {
            book.DisplayInfo(); // 调用每本书的 DisplayInfo 方法显示信息
        }
    }
}

// 主程序入口类
class Program
{
    static void Main(string[] args)
    {
        // 创建一个 Library 对象
        Library myLibrary = new Library();
        
        // 创建 Book 对象并添加到图书馆
        myLibrary.AddBook(new Book("1984", "George Orwell", 1949));
        myLibrary.AddBook(new Book("To Kill a Mockingbird", "Harper Lee", 1960));

        // 显示图书馆中所有书籍的信息
        myLibrary.DisplayAllBooks();
    }
}

注释说明

  • 类和对象BookLibrary 是两个类,它们定义了书籍和图书馆的结构和行为。myLibraryLibrary 类的一个实例,表示一个具体的图书馆。
  • 属性Title, Author, YearPublishedBook 类的属性,存储书籍的基本信息。
  • 方法DisplayInfoBook 类的一个方法,用于输出书籍的详细信息。AddBookDisplayAllBooksLibrary 类的方法,分别用于添加书籍和显示所有书籍信息。
  • 封装:通过将 Title, Author, YearPublished 设置为私有属性,并通过构造函数进行初始化,实现了封装。
  • 构造函数和析构函数Book 类中的构造函数用于初始化新对象,析构函数用于在对象销毁时进行清理。
  • 继承和多态:虽然这个简单的例子中没有直接展示继承和多态,但可以通过扩展 Book 类(例如创建一个 Novel 类继承自 Book)来实现和展示这些概念。

扩展示例

为了更好地展示继承和多态的概念,我们可以扩展之前的图书馆管理系统,添加一个新的类 Novel,它继承自 Book 类,并重写 DisplayInfo 方法来展示多态的效果。下面是扩展后的代码,包括详细的注释来解释每个部分的功能和目的。

using System;
using System.Collections.Generic;

// 定义一个公共类 Book,代表书籍对象
public class Book
{
    public string Title { get; private set; }  // 书的标题
    public string Author { get; private set; } // 书的作者
    public int YearPublished { get; private set; } // 书的出版年份

    // 构造函数:在创建 Book 对象时调用,用于初始化对象的属性
    public Book(string title, string author, int yearPublished)
    {
        Title = title;
        Author = author;
        YearPublished = yearPublished;
    }

    // 虚方法:用于显示书籍的详细信息,可以在子类中被重写
    public virtual void DisplayInfo()
    {
        Console.WriteLine($"{Title}, written by {Author}, published in {YearPublished}.");
    }

    // 析构函数:在对象被销毁时调用,用于执行清理操作
    ~Book()
    {
        Console.WriteLine("Book destructor called.");
    }
}

// 定义一个 Novel 类,继承自 Book 类
public class Novel : Book
{
    public string Genre { get; private set; } // 小说的类型

    // 构造函数:初始化 Novel 对象,调用基类构造函数
    public Novel(string title, string author, int yearPublished, string genre)
        : base(title, author, yearPublished)
    {
        Genre = genre;
    }

    // 重写 DisplayInfo 方法,展示多态
    public override void DisplayInfo()
    {
        Console.WriteLine($"{Title}, a {Genre} novel by {Author}, published in {YearPublished}.");
    }
}

// 定义一个公共类 Library,代表图书馆,用于管理书籍
public class Library
{
    private List<Book> books = new List<Book>(); // 存储 Book 对象的列表

    // 添加书到图书馆
    public void AddBook(Book book)
    {
        books.Add(book);
    }

    // 显示所有书的信息
    public void DisplayAllBooks()
    {
        foreach (var book in books)
        {
            book.DisplayInfo(); // 调用 Book 或 Novel 的 DisplayInfo 方法
        }
    }
}

// 主程序入口类
class Program
{
    static void Main(string[] args)
    {
        Library myLibrary = new Library();
        myLibrary.AddBook(new Book("1984", "George Orwell", 1949));
        myLibrary.AddBook(new Novel("The Hobbit", "J.R.R. Tolkien", 1937, "Fantasy"));

        myLibrary.DisplayAllBooks(); // 展示多态效果
    }
}

详细注释说明

  • 继承Novel 类继承自 Book 类。这意味着 Novel 类自动获得了 Book 类的所有属性和方法,同时可以添加或修改它自己的属性和方法。
  • 多态Novel 类重写了 Book 类的 DisplayInfo 方法。当 DisplayInfo 方法在 Book 类的上下文中被调用时,它表现出基类的行为;但当同样的方法在 Novel 类的实例上调用时,它表现出 Novel 类特有的行为。这就是多态的体现,即同一个接口(DisplayInfo 方法),在不同的对象上执行时可以有不同的行为。
  • 构造函数Novel 类的构造函数使用 : base(...) 语法调用了 Book 类的构造函数,确保基类的属性被正确初始化。
  • 析构函数:虽然 Novel 类没有显式定义析构函数,但它会继承 Book 类的析构函数。

通过这个扩展示例,我们可以看到继承和多态如何在实际的程序设计中被应用,以及它们如何帮助我们编写更清晰、更灵活和更易于维护的代码。

posted @   StarYou  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示