C#学习相关系列之数据类型类的三大特性(二)

简介: C#学习相关系列之数据类型类的三大特性(二)

一、封装

       封装:将类的某些信息隐藏在类的内部(用private修饰),不允许外部程序直接访问,需要访问也是访问该类为其提供的公共属性。

装属性的作用:防止类中的数据被恶意修改。

封装属性的好处:1.可以隐藏类的实现细节

                            2.外部只能通过访问规定的属性来访问数据,保护数据

                            3.方便加入控制语句,即对数据做约束

 

 

代码例子:

public class Person  
{  
    // 私有字段  
    private string name;  
    private int age;  
  
    // 公共构造函数  
    public Person(string name, int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
    // 特性可以保护数据安全
    public int Age
    {
        get { return age; }
        set { age =value; }
    }  
    // 公共方法,用于获取姓名  
    public string GetName()  
    {  
        return name;  
    }  
  
    // 公共方法,用于设置姓名  
    public void SetName(string newName)  
    {  
        name = newName;  
    }  
  
    // 公共方法,用于获取年龄  
    public int GetAge()  
    {  
        return age;  
    }  
  
    // 公共方法,用于设置年龄  
    public void SetAge(int newAge)  
    {  
        if (newAge > 0 && newAge < 150) // 简单的年龄验证逻辑  
        {  
            age = newAge;  
        }  
        else  
        {  
            throw new ArgumentOutOfRangeException("Invalid age.");  
        }  
    }  
}

       在上面的例子中,Person类封装了两个私有字段nameage。通过公共的构造函数和设置器方法(如SetNameSetAge),我们可以控制对内部状态的访问和修改。这样,外部代码只能通过这些公共方法来访问和修改Person对象的内部状态,而不能直接访问或修改私有字段。这提高了代码的可维护性和健壮性,因为我们可以控制对内部状态的访问和修改,并在必要时添加额外的验证逻辑。

二、继承

  1. 代码重用:继承允许我们定义一个类,然后创建其他类从已有的类中派生出来。这样,我们可以重用基类中的方法和属性,减少代码的重复编写。
  2. 扩展性:继承使得我们能够定义一个基类,然后根据需要创建派生类来扩展或修改基类的功能。这使得代码更加灵活,可以根据需求进行扩展和定制。
  3. 层次结构:通过继承,我们可以建立类之间的层次结构,使得代码更加有组织性和层次性。这有助于理解代码的结构和功能,以及更好地进行代码维护和调试。
  4. 多态性:继承是实现多态性的基础。通过继承,我们可以创建具有相同接口但具有不同实现的方法和属性,从而实现多态性。这使得代码更加灵活,可以根据实际需求选择不同的实现方式。
// 基类  
public class Animal  
{  
    public string Name { get; set; }  
  
    public void Eat()  
    {  
        Console.WriteLine($"{Name} is eating.");  
    }  
}  
  
// 派生类  
public class Dog : Animal  
{  
    public void Bark()  
    {  
        Console.WriteLine($"{Name} is barking.");  
    }  
}  
  
// 使用继承  
public class Program  
{  
    public static void Main(string[] args)  
    {  
        Dog dog = new Dog();  
        dog.Name = "Tommy";  
        dog.Eat(); // 继承了Animal类的Eat方法  
        dog.Bark(); // Dog类自己的Bark方法  
    }  
}

继承的特征:

1.子类继承了父类的非私有的属性与方法,构造方法除外

2.子类在创建构造方法时需要调用父类构造方法;

               格式:派生类名(总参数列表(父子类的参数)):base(父类参数){}

3. 在创建子类对象时,系统会默认的先调用父类的构造方法,在调用子类的构造方法

4. 子类想使用父类的属性和方法时,需要用到base关键字(base.)  

重写与重载的区别:

1.作用范围不同,重写发生在具有父子关系的两个类中的同名方法,而重载是在同一个类中同名方法。

2.不同点不同,重写的两个方法的返回值与参数相同,方法的声明不同(也就是{ }中的内容不同),重载的方法只要参数列表不同

三、多态

多态:是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

代码例子:

using System;  
  
// 基类  
class Animal  
{  
    public void Speak()  
    {  
        Console.WriteLine("Animal speaks.");  
    }  
}  
  
// 派生类1  
class Dog : Animal  
{  
    public override void Speak()  
    {  
        Console.WriteLine("Dog barks.");  
    }  
}  
  
// 派生类2  
class Cat : Animal  
{  
    public override void Speak()  
    {  
        Console.WriteLine("Cat meows.");  
    }  
}  
  
class Program  
{  
    static void Main()  
    {  
        // 创建一个Animal引用指向Dog对象  
        Animal myDog = new Dog();  
        // 调用基类Animal的Speak方法,实际上调用的是Dog的Speak方法,因为myDog是Animal类型,但实际上指向的是Dog对象。这就是多态性。  
        myDog.Speak(); // 输出 "Dog barks."  
  
        // 创建一个Animal引用指向Cat对象  
        Animal myCat = new Cat();  
        // 同样,调用基类Animal的Speak方法,实际上调用的是Cat的Speak方法。  
        myCat.Speak(); // 输出 "Cat meows."  
    }  
}

        在这个例子中,我们有一个基类Animal和两个派生类DogCat。每个派生类都重写了基类的Speak方法。在主程序中,我们创建了一个Animal类型的引用,但实际上它指向了一个Dog对象或一个Cat对象。当我们调用这个引用的Speak方法时,会调用实际对象的Speak方法,这就是多态性的体现。

其实多态的作用就是把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

以上程序也体现了开放封闭原则,如果以后有人需要扩展这个程序,还想再添加一个牛(cow),很容易,只需要添加一个cow类,继承Animal,重写speak()方法,添加给父类对象就可以了。至此,该程序的扩展性得到了提升,而又不需要查看源代码是如何实现的就可以扩展新功能。这就是多态带来的好处。

相关文章
|
4天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
10天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
25 7
C# 9.0 新特性解析
|
9天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
20 2
|
2月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
202 59
|
28天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
33 1
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
1月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
12 0
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
91 2
|
2月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
25 2