.NET 帮助

C# 面向对象(它如何为开发人员工作)

Kannaopat Udonpant
坎那帕·乌东攀
2024年四月3日
分享:

面向对象的程序设计 (OOP)是软件开发中的一个基本概念,它使程序员能够创建模块化、可重用和可调整的代码。 C# 是一种面向对象的现代编程语言,为构建复杂的应用程序提供了一个强大的框架。 本指南介绍了使用 C# 的 OOP 概念,侧重于实际实现和编码示例,以帮助初学者理解并有效应用这些原则。 我们还将讨论如何将这些原则应用于IronPdf C# 库.

理解面向对象编程概念

OOP 的核心是几个关键概念:类、对象、继承、多态性、抽象和封装。 这些概念允许开发人员对现实世界的实体建模、管理复杂性并提高代码的可维护性。

类和对象:构件

类创建单个对象。 类是一个蓝图,定义了类中所有对象共享的数据和行为。 对象是类的一种表现形式。 它体现的是真实的价值,而不是类蓝图中定义的抽象占位符。

public class Car // A class declared as 'Car' defines its structure and behavior.
{
    public string Name;
    public string Color;
    public void DisplayInfo()
    {
        Console.WriteLine($"Name: {Name}, Color: {Color}");
    }
}
class Program // This is the program class, serving as the entry point of a C# program.
{
    static void Main(string [] args)
    {
        Car myCar = new Car();
        myCar.Name = "Toyota";
        myCar.Color = "Red";
        myCar.DisplayInfo();
    }
}
public class Car // A class declared as 'Car' defines its structure and behavior.
{
    public string Name;
    public string Color;
    public void DisplayInfo()
    {
        Console.WriteLine($"Name: {Name}, Color: {Color}");
    }
}
class Program // This is the program class, serving as the entry point of a C# program.
{
    static void Main(string [] args)
    {
        Car myCar = new Car();
        myCar.Name = "Toyota";
        myCar.Color = "Red";
        myCar.DisplayInfo();
    }
}

在本例中,类有两个数据成员(名称颜色)和一种方法(DisplayInfo). 作为应用程序入口的Main方法创建了一个Car类的实例,并为其字段赋值,然后调用其方法来显示这些值。

C# 面向对象(如何为开发人员工作):图 1 - 控制台通过 DisplayInfo 方法显示汽车对象的成员值(名称、颜色

继承:扩展现有类

继承允许类继承现有类的属性和方法。 属性被继承的类称为基类,继承这些属性的类称为派生类。

public class Vehicle
{
    public string LicensePlate;
    public void Honk()
    {
        Console.WriteLine("Honking");
    }
}
public class Truck : Vehicle // Truck is a child class derived from the Vehicle base class.
{
    public int CargoCapacity;
}
class Program
{
    static void Main(string [] args)
    {
        Truck myTruck = new Truck();
        myTruck.LicensePlate = "ABC123";
        myTruck.CargoCapacity = 5000;
        myTruck.Honk();
    }
}
public class Vehicle
{
    public string LicensePlate;
    public void Honk()
    {
        Console.WriteLine("Honking");
    }
}
public class Truck : Vehicle // Truck is a child class derived from the Vehicle base class.
{
    public int CargoCapacity;
}
class Program
{
    static void Main(string [] args)
    {
        Truck myTruck = new Truck();
        myTruck.LicensePlate = "ABC123";
        myTruck.CargoCapacity = 5000;
        myTruck.Honk();
    }
}

在本例中,Truck 是一个派生类,它扩展了 Vehicle 基类,继承了其 LicensePlate 字段和 Honk 方法,同时添加了一个新字段 CargoCapacity

多态性和抽象:接口和抽象类

多态性使对象可以作为其基类而非特定类的实例来处理。 抽象允许您定义抽象类和接口,这些类和接口不能实例化,但可以用作基类。

抽象类和方法

抽象类不能实例化,通常用于提供基类的通用定义,供多个派生类共享。

public abstract class Shape
{
    public abstract void Draw();
}
public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}
public abstract class Shape
{
    public abstract void Draw();
}
public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

实现多个接口

接口建立了一种协议或契约,类可以通过实现其定义的方法来履行这种协议或契约。 类可以实现多个接口,从而实现一种多态性。

public interface IDrawable
{
    void Draw();
}
public interface IColorable
{
    void Color();
}
public class CustomShape : IDrawable, IColorable // Defining a new class CustomShape that implements IDrawable and IColorable.
{
    public void Draw()
    {
        Console.WriteLine("Custom shape drawn");
    }
    public void Color()
    {
        Console.WriteLine("Custom shape colored");
    }
}
public interface IDrawable
{
    void Draw();
}
public interface IColorable
{
    void Color();
}
public class CustomShape : IDrawable, IColorable // Defining a new class CustomShape that implements IDrawable and IColorable.
{
    public void Draw()
    {
        Console.WriteLine("Custom shape drawn");
    }
    public void Color()
    {
        Console.WriteLine("Custom shape colored");
    }
}

封装:保护数据

封装是一种限制访问对象的某些组件并防止外部人员看到内部表示的机制。 这可以通过使用访问修饰符来实现。

public class Person
{
    private string name; // Private variable, inaccessible outside the class
    public string Name   // Public property to access the private variable
    {
        get { return name; }
        set { name = value; }
    }
}
// Example showing a simple customer class with encapsulated data
public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; } 
}
public class Person
{
    private string name; // Private variable, inaccessible outside the class
    public string Name   // Public property to access the private variable
    {
        get { return name; }
        set { name = value; }
    }
}
// Example showing a simple customer class with encapsulated data
public class Customer
{
    public string Name { get; set; }
    public string Address { get; set; } 
}

在本例中,name 字段是私有的,因此在Person 类之外无法访问。 通过公共 Name 属性访问该字段,该属性包括 getset 方法。

实际使用案例和编码示例

现在,我们将探讨一个涉及多个类的示例,以实际演示这些原则。

using System;
namespace OOPExample
{
    public class Program
    {
        static void Main(string [] args)
        {
            ElectricCar myElectricCar = new ElectricCar();
            myElectricCar.Make = "Tesla";
            myElectricCar.Model = "Model 3";
            myElectricCar.BatteryLevel = 100;
            myElectricCar.Drive();
            myElectricCar.Charge();
        }
    }
    public abstract class Vehicle
    {
        public string Make { get; set; }
        public string Model { get; set; }
        public abstract void Drive();
    }
    public class Car : Vehicle
    {
        public override void Drive()
        {
            Console.WriteLine($"The {Make} {Model} is driving.");
        }
    }
    public class ElectricCar : Car
    {
        public int BatteryLevel { get; set; }
        public void Charge()
        {
            Console.WriteLine("Charging the car.");
        }
        public override void Drive()
        {
            Console.WriteLine($"The {Make} {Model} is driving silently.");
        }
    }
}
using System;
namespace OOPExample
{
    public class Program
    {
        static void Main(string [] args)
        {
            ElectricCar myElectricCar = new ElectricCar();
            myElectricCar.Make = "Tesla";
            myElectricCar.Model = "Model 3";
            myElectricCar.BatteryLevel = 100;
            myElectricCar.Drive();
            myElectricCar.Charge();
        }
    }
    public abstract class Vehicle
    {
        public string Make { get; set; }
        public string Model { get; set; }
        public abstract void Drive();
    }
    public class Car : Vehicle
    {
        public override void Drive()
        {
            Console.WriteLine($"The {Make} {Model} is driving.");
        }
    }
    public class ElectricCar : Car
    {
        public int BatteryLevel { get; set; }
        public void Charge()
        {
            Console.WriteLine("Charging the car.");
        }
        public override void Drive()
        {
            Console.WriteLine($"The {Make} {Model} is driving silently.");
        }
    }
}

在本例中,驱动器()是 Vehicle 抽象类的抽象方法。 Car 是一个实现 Drive 的派生类。()电动汽车是另一个层级,增加了电池级别和自己的驱动器等新功能。() 实施。 该结构演示了抽象、封装、继承和多态性在 C# 应用程序中的协同工作。

C# 面向对象(如何为开发人员工作):图 2 - 代码的控制台输出,打印驱动抽象方法和充电方法的输出

IronPDF:C# PDF 库

"(《世界人权宣言》)用于 .NET 的 IronPDF 库C# PDF 是一款面向 C# 开发人员的多功能工具,旨在简化在 .NET 应用程序中创建、编辑和提取 PDF 文档的过程。 IronPDF 能够轻松地从 HTML 字符串生成 PDFPDF、URL 或 ASPX 文件提供了对 PDF 创建和操作流程的高度控制。 此外,IronPDF 还支持添加页眉和页脚、水印和加密等高级功能,是在 .NET 应用程序中处理 PDF 的全面解决方案。

IronPDF 与 OOP 的示例

下面是一个在 C# 应用程序中使用 IronPDF 的简化示例,其中使用了 virtual 关键字来说明如何通过继承(OOP 的核心概念)来扩展 IronPDF 的功能。假设我们有一个生成基本 PDF 报告的基类和一个扩展该功能以包含自定义页眉的派生类:

using IronPdf;
public class BasicReportGenerator
{
    public virtual PdfDocument GenerateReport(string htmlContent)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        return pdf;
    }
}
public class CustomReportGenerator : BasicReportGenerator
{
    public override PdfDocument GenerateReport(string htmlContent)
    {
        var pdf = base.GenerateReport(htmlContent);
        AddCustomHeader(pdf, "Custom Report Header");
        return pdf;
    }
    private void AddCustomHeader(PdfDocument document, string headerContent)
    {
        // Create text header
        TextHeaderFooter textHeader = new TextHeaderFooter
        {
            CenterText = headerContent,
        };
        document.AddTextHeaders(textHeader);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // HTML content for the report
        string htmlContent = "<html><body><h1>Sample Report</h1><p>This is a sample report content.</p></body></html>";
        // Using BasicReportGenerator
        BasicReportGenerator basicReportGenerator = new BasicReportGenerator();
        var basicPdf = basicReportGenerator.GenerateReport(htmlContent);
        basicPdf.SaveAs("basic_report.pdf");
        // Using CustomReportGenerator
        CustomReportGenerator customReportGenerator = new CustomReportGenerator();
        var customPdf = customReportGenerator.GenerateReport(htmlContent);
        customPdf.SaveAs("custom_report.pdf");
        Console.WriteLine("PDF reports generated successfully.");
    }
}
using IronPdf;
public class BasicReportGenerator
{
    public virtual PdfDocument GenerateReport(string htmlContent)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        return pdf;
    }
}
public class CustomReportGenerator : BasicReportGenerator
{
    public override PdfDocument GenerateReport(string htmlContent)
    {
        var pdf = base.GenerateReport(htmlContent);
        AddCustomHeader(pdf, "Custom Report Header");
        return pdf;
    }
    private void AddCustomHeader(PdfDocument document, string headerContent)
    {
        // Create text header
        TextHeaderFooter textHeader = new TextHeaderFooter
        {
            CenterText = headerContent,
        };
        document.AddTextHeaders(textHeader);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        // HTML content for the report
        string htmlContent = "<html><body><h1>Sample Report</h1><p>This is a sample report content.</p></body></html>";
        // Using BasicReportGenerator
        BasicReportGenerator basicReportGenerator = new BasicReportGenerator();
        var basicPdf = basicReportGenerator.GenerateReport(htmlContent);
        basicPdf.SaveAs("basic_report.pdf");
        // Using CustomReportGenerator
        CustomReportGenerator customReportGenerator = new CustomReportGenerator();
        var customPdf = customReportGenerator.GenerateReport(htmlContent);
        customPdf.SaveAs("custom_report.pdf");
        Console.WriteLine("PDF reports generated successfully.");
    }
}

在本例中,BasicReportGenerator 有一个方法 GenerateReport,该方法接收 HTML 内容并使用 IronPDF 生成 PDF 文档。 CustomReportGenerator类继承自BasicReportGenerator,它覆盖了GenerateReport方法,以便在基本方法生成PDF后向其中添加自定义页眉。 以下是代码生成的自定义报告:

C# 面向对象(如何为开发人员工作):图 3 - 根据代码示例生成的自定义 PDF,展示了文章中讨论的 OOP 方法

结论

C# 面向对象(如何为开发人员工作):图 4 - IronPDF 许可页面

通过理解和应用 OOP 的基本原则,初学者可以在掌握 C# 和开发强大的软件解决方案方面迈出重要的一步。 继承和多态可以实现代码的重用和灵活性,让新的类建立在现有结构和功能的基础上。 抽象和封装确保类只向外界暴露必要的内容,保持内部工作的私密性和安全性,避免意外使用。 您可以试用 IronPDF免费试用 C# 生成 PDF您还可以从 "liteLicense "开始使用".NET "和 "Node.js"。

Kannaopat Udonpant
坎那帕·乌东攀
软件工程师
在成为软件工程师之前,Kannapat 从日本北海道大学完成了环境资源博士学位。在攻读学位期间,Kannapat 还成为了生物生产工程系车辆机器人实验室的成员。2022年,他利用自己的 C# 技能加入了 Iron Software 的工程团队,专注于 IronPDF。Kannapat 珍视他的工作,因为他能直接向编写 IronPDF 大部分代码的开发者学习。除了同伴学习,Kannapat 还享受在 Iron Software 工作的社交方面。不写代码或文档时,Kannapat 通常在 PS5 上玩游戏或重看《最后生还者》。
< 前一页
C# 操作(开发人员如何使用)
下一步 >
C# String.Join(它如何为开发人员工作)