c#类(类的多态讲解)

类修饰符 class 类名
{

}

  • public:是类的修饰符,下面介绍常使用的几个类修饰符
  • new:仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的、与基类中同名的成员。
  • public:不限制对该类的访问。
  • protected:只能从其所在类和所在类的子类(派生类)进行访问。
  • internal:只有其所在类才能访问。
  • private:只有.Net中的应用程序或库才能访问。
  • abstract:抽象类,不允许建立类的实例。
  • sealed:密封类,不允许被继承。

构造函数和析构函数

构造函数和析构函数是类中比较特殊的两种成员函数,主要用来对对象进行初始化和回收对象资源。一般来说,对象的生命周期从构造函数开始,以析构函数结束。

简明来说就是当我实例化了一个ProgramClass类,他在第一时间就会执行构造函数,当我用完了ProgramClass类,他会自动执行析构函数。

析构函数

不能在结构中定义析构函数。只能对类使用析构函数。

一个类只能有一个析构函数。

无法继承或重载析构函数。

无法调用析构函数。它们是被自动调用的。

析构函数既没有修饰符,也没有参数。

析构函数一般都是在程序结束时才执行

类代码:

class ProgramClass
    {
        public ProgramClass()//构造函数,
        {
            Console.WriteLine("构造函数");
        }
        public void Shownum()
        {
            Console.WriteLine("这是Shownum函数");
        }
        ~ProgramClass()//析构函数
        {
            Console.WriteLine("析构函数");
        }

    }

主函数代码:

static void Main(string[] args)
        {
            /*测试构造函数和析构函数*/
            ProgramClass pc = new ProgramClass();
            pc.Shownum();
        }

输出:

构造函数
这是Shownum函数
析构函数

类的面向对象特性

主要内容在上一篇(面向对象OOP的三个基本特征)

类的封装

class Myclass //创建一个类
    {
        private int x = 0;//创建私有变量x
        private int y = 0;//创建私有变量y
        public int X//属性
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }
        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }
         public int Add()
        {
            return x + y;
        }
    }

主函数:

            /*类的封装*/
            Myclass mc = new Myclass();//实例化对象
            mc.X = 6;
            mc.Y = 7;
            Console.WriteLine("x+y={0}", mc.Add());

类的多态

  • 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而为解决同一问题提供多种途径。

  • 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现。

在C#中可以通过多种途径实现多态性:

  1. 虚方法:将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)

2.== 抽象类与抽象方法==:如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写。

3.接口实现:

我们选择使用虚方法实现多态还是抽象方类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象。

  • 抽象类:不需要使用基类实例化的对象

  • 虚方法:需要使用基类实例化的对象

举例:

  1. 现有Clerk(基类),ProjectManager(继承类),此时需要使用虚方法来实现多态,因为我们需要使用Clerk创建的对象,这些对象是普通员工对象 职员(Clerk)需要有工作计划,经理(ProjectManager)也需要有工作计划

  2. 现有Drink类作为基类,Milk,Tea类继承Drink,我们需要使用的是Milk和Tea创建对象,无需Drink创建对象,此时将Drink写成抽象类

茶(Tea)可以饥渴,牛奶(Milk)也可以解渴————此时抽象出一个饮料(Drink)类作为基类

 

采用虚拟方法代码如下:

class Clerk
{
    public virtual void WorkPlan()    // 此处采用virtual方法
    {
         Console.WriteLine("我是职员,我需要有工作计划");
    }
}    
class ProjectManager:Clerk  // 继承于Clerk
 {
        public override void WorkPlan()  // 用override进行重写
        {
            Console.WriteLine("我是经理,我也需要有工作计划");
        }
 }
        

class Program              
{
      static void Main(string[] args)
      {
          Clerk myClerk = new Clerk();
          ProjectManager myPM = new ProjectManager();
          Clerk[] clerk = { myClerk, myPM };
          foreach (Clerk outclerk in clerk)
              outclerk.WorkPlan();
          Console.ReadKey();     
      }
}

采用抽象方法代码如下:

abstract class Drink
{
    public abstract void drink();   // 使用抽象化方法时,不能有方法体
}

class Milk:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是牛奶,我可以解渴");
    }
}

class Tea:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是茶,我可以解渴");
    }
}


 class Program 
 {
            static void Main(string[] args)
            {
    Drink myMilk = new Milk();  // 此处注意抽象类Drink是不能进行实例化的
    Drink myTea = new Tea();
    Drink[] drink = { myMilk, myTea };
    foreach (Drink outDrink in drink)
        outDrink.drink();
    Console.ReadKey();
   }
 }

我的多态程序

类:

 class Myclass
    {
        private int x = 0;
        private int y = 0;
        public int X
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }
        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }
        public virtual int Add()
        //定义一个virtual类型的方法,以便在子类(派生类)中重写该方法
        {
            return X + Y;
        }
    }
    class MyClass2 : Myclass
    {
        public override int Add()//重写求和方法
        {
            //int x = 5;
            //int y = 7;
            return X+ Y;
        }
    }

主函数:

            /*类的多态*/
            MyClass2 mc2 = new MyClass2();
            //使用子类(派生类)MyClass2的对象实例化基类Myclass的对象
            Myclass mc1=(Myclass)mc2;
            mc1.X = 3;
            mc1.Y = 5;
            Console.WriteLine(mc2.Add());
            Console.WriteLine(mc1.Add());

注意

1.virtual修饰符不能与private、static、abstract或者override修饰符同时使用。

2.override修饰符不能与new、static或者virtual修饰符同时使用,并且重写方法只能用于重写基类中的虚方法。

3.C#中,继承、虚方法和重写方法组合在一起才能实现多态性。

<think>首先,用户要求讲解C#中的“”。我需要基于提供的参考引用来构建回答,但这些引用是关于C#的概述、方法、Task任务、同步和DateTime的。用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但我看不到用户上一次的问题是什么,因为在这个对话中,这是第一个用户消息。 回顾上下文:用户消息开头是“参考站内引用:”,然后列出了引用[1]到[5],最后用户说:“我想获取C#讲解内容 请问C#的详细讲解”。所以,核心需求是讲解C#。 系统指令: - 所有行内数学表达式使用$...$格式(但这里可能不涉及数学)。 - 独立公式使用$$...$$格式并单独成段(同样,可能不适用)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 系统指令还要求在末尾生成相关问题,似于示例中在代码块后添加“§§相关问题§§”。 现在,消化引用内容: - [^1]: 概述C#的基本定义、成员、构造函数、静态成员、封装、继承、多态等。 - [^2]: 关于方法的定义,强调方法是的成员,封装行为。 - [^3]: 关于Task的异步操作。 - [^4]: 关于同步,使用Lock关键字。 - [^5]: 关于DateTime结构体。 用户明确说“我想获取C#讲解内容”,所以我应该聚焦在C#上。引用[^1]直接相关,提供了全面介绍。其他引用如[^2]关于方法(是的一部分)、[^3]关于Task(可能是一个)、[^4]关于同步(可能与相关)、[^5]关于DateTime(是一个结构体,但相关)。 我应该构建一个结构清晰的回答: 1. 开头介绍C#的基本概念。 2. 详细讲解的组成部分:定义、成员、构造函数、静态成员等。 3. 覆盖面向对象的特性:封装、继承、多态。 4. 引用相关信息,在末尾添加引用标识。 5. 使用中文。 6. 末尾生成相关问题。 步骤: 1. **介绍C#**:基于[^1],说明C#的核心概念,用于构建对象。 2. **的定义**:如何定义一个(例如,public class MyClass)。 3. **成员**:包括字段、属性、方法、事件等。参考[^2],讲解方法作为成员。 4. **构造函数**:如何使用构造函数初始化对象。 5. **静态成员**:静态方法与实例方法的区别。 6. **面向对象特性**: - 封装:隐藏内部实现细节。 - 继承:从基派生新。 - 多态:通过接口或虚方法实现多态行为。 7. **示例代码**:系统指令有代码块的示例(如Python快速排序),所以我应该添加简单的C#代码示例来展示的使用。例如,定义一个简单的。 8. **引用**:在讲解中自然地引用引用内容,例如在提到全面认识时引用[^1],在讲方法时引用[^2]。 9. **其他引用**:虽然用户聚焦在上,但可以简要提到相关概念如异步(Task)或同步(Lock),因为它们可能与的方法相关,但不要偏离主题。 10. **结尾**:强调掌握的重要性,引用[^1]。 11. **生成相关问题**:在回答末尾添加相关问题部分,似于示例的“§§相关问题§§”。 确保回答真实可靠:我需要基于C#知识。例如: - 定义:public class ClassName { } - 成员:public int MyProperty { get; set; } - 方法:public void MyMethod() { } - 构造函数:public ClassName() { } - 静态成员:public static void StaticMethod() { } - 封装:使用访问修饰符private, public等。 - 继承:class Derived : Base - 多态:使用virtual和override。 代码示例: ```csharp public class Person { // 字段 private string name; // 属性 public string Name { get { return name; } set { name = value; } } // 构造函数 public Person(string name) { this.name = name; } // 方法 public void Greet() { Console.WriteLine($"Hello, my name is {Name}"); } // 静态方法 public static void StaticGreet() { Console.WriteLine("This is a static greeting."); } } ``` 然后,在讲解中使用这个示例。 结构回答: - 引言:C#的概述。 - 的定义和基本结构。 - 的成员详解。 - 构造函数。 - 静态成员。 - 面向对象特性:封装、继承、多态。 - 示例代码。 - 引用标识。 - 相关问题。 在引用段落末尾添加引用标识:例如,在说“从最基本的定义到高级特性”时,添加[^1]。 相关问题: 1. C#中如何使用继承? 2. 静态方法和实例方法有何区别? 3. 如何在C#中实现多态行为? 4. C#与结构体有什么区别? 5. 如何处理中的并发问题?(参考[^4]) 最后,确保语言是中文。 </think>### C#的详细讲解 C#中的“”(Class)是面向对象编程(OOP)的核心构建块,用于定义对象的模板。它封装了数据(字段)和行为(方法),支持特性如封装、继承和多态,使代码更模块化、可重用和维护性更高。下面基于您的参考引用,我将逐步讲解C#的关键方面,确保内容清晰可靠。 #### 1. **的定义和基本结构** 在C#中,使用`class`关键字定义,通常包含访问修饰符(如`public`)、名和成员(字段、属性、方法等)。是创建对象的蓝图,例如: ```csharp public class Car // 定义一个 { // 字段:存储数据 private string model; // 私有字段,用于封装 // 属性:提供对字段的安全访问 public string Model { get { return model; } // 读取值 set { model = value; } // 设置值 } // 构造函数:初始化对象 public Car(string model) { this.model = model; } // 方法:定义行为 public void StartEngine() { Console.WriteLine($"{Model} engine started!"); } } ``` - **定义**:模板指定了对象的属性和行为,使用时通过`new`关键字创建实例,如`Car myCar = new Car("Tesla");`。 - **成员型**:包括字段(存储数据)、属性(控制访问)、方法(执行操作)、事件等。方法作为的成员,封装了与对象相关的行为,可以通过实例调用[^2]。 #### 2. **构造函数** 构造函数用于初始化实例。它有与同名的名称,没有返回型: - **默认构造函数**:如果未定义,编译器自动生成无参构造函数。 - **参数化构造函数**:允许传入初始值,如`public Car(string model) { ... }`。 - **静态构造函数**:用`static`修饰,用于初始化静态成员,在第一次引用时执行。 示例: ```csharp public class Example { public int Count; public Example(int count) // 参数化构造函数 { Count = count; } } ``` #### 3. **静态成员** 静态成员(用`static`修饰)属于本身,而非特定实例: - **静态字段/属性**:所有实例共享同一个值。 - **静态方法**:可直接通过名调用,不需实例化。 - 示例: ```csharp public class Counter { public static int TotalCount = 0; // 静态字段 public static void Increment() // 静态方法 { TotalCount++; } } // 调用:Counter.Increment(); ``` 静态方法常用于工具或全局函数,而实例方法依赖对象状态[^2]。 #### 4. **面向对象特性** C#支持OOP的三大支柱: - **封装**:隐藏内部实现细节,通过访问修饰符(如`private`, `public`, `protected`)控制成员可见性。例如,字段设为`private`,通过公共属性暴露,确保数据安全[^1]。 - **继承**:使用`:`符号从基派生新,复用代码。派生继承基成员,并可添加新功能: ```csharp public class Vehicle // 基 { public void Move() { Console.WriteLine("Moving"); } } public class Car : Vehicle // 派生 { public void Accelerate() { Console.WriteLine("Accelerating"); } } ``` - **多态**:通过虚方法(`virtual`)和重写(`override`)实现不同对象对同一方法的差异化响应: ```csharp public class Shape { public virtual void Draw() { Console.WriteLine("Drawing a shape"); } } public class Circle : Shape { public override void Draw() { Console.WriteLine("Drawing a circle"); } // 多态行为 } ``` 这些特性使C#适用于构建复杂应用,提升灵活性和扩展性[^1]。 #### 5. **相关概念的简要关联** 虽然本主题聚焦于,但其他概念如异步操作(Task)和同步(Lock)常与方法交互: - **异步方法**:在中,方法可以使用`async`和`Task`处理I/O操作,避免阻塞线程[^3]。例如: ```csharp public class DataService { public async Task<string> FetchDataAsync() // 异步方法 { await Task.Delay(1000); // 模拟网络请求 return "Data loaded"; } } ``` - **同步控制**:在多线程场景中,方法使用`lock`关键字确保变量访问同步,防止竞争条件[^4]。例如: ```csharp public class Account { private decimal balance; private object lockObj = new object(); public void Deposit(decimal amount) { lock(lockObj) // 同步访问 { balance += amount; } } } ``` 此外,结构体(如DateTime)是值型,不同于(引用型),但常用于成员中[^5]。 #### 总结 通过掌握C#的基础(定义、成员、构造函数、静态成员)和高级特性(封装、继承、多态),您可以高效构建面向对象应用。作为C#的核心,为开发复杂系统提供了强大工具,深入学习将为异步编程、并发控制等进阶主题奠定基础[^1]。如果您有具体代码场景,可提供更多细节进行针对性分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锡城筱凯

你的鼓励是我创造的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值