【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();
}
}
注释说明
- 类和对象:
Book
和Library
是两个类,它们定义了书籍和图书馆的结构和行为。myLibrary
是Library
类的一个实例,表示一个具体的图书馆。 - 属性:
Title
,Author
,YearPublished
是Book
类的属性,存储书籍的基本信息。 - 方法:
DisplayInfo
是Book
类的一个方法,用于输出书籍的详细信息。AddBook
和DisplayAllBooks
是Library
类的方法,分别用于添加书籍和显示所有书籍信息。 - 封装:通过将
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
类的析构函数。
通过这个扩展示例,我们可以看到继承和多态如何在实际的程序设计中被应用,以及它们如何帮助我们编写更清晰、更灵活和更易于维护的代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义