‫在本视频中, 您将学习C sharp或一般编程中的继承｡
‫我会尽量把它保持得非常简单, 因为如果你仔细看它, 它可能会变得相当复杂, 因为有很多事情在发生｡
‫但我会尽可能地简化它, 因为继承的概念实际上是代码的可重用性｡
‫这让我们不仅可以减少自己的代码, 还可以减少其他开发人员的代码,
‫甚至直接减少其他命名空间的代码, 而不必一次又一次地手动编写大量代码, 这是以前的事情｡
‫这确实减少了重复或冗余代码｡
‫所以继承的概念基本上是它是面向对象编程的一个基本概念｡
‫它允许您定义重用或继承､ 扩展或修改父类行为的子类｡
‫其成员被继承的类称为基类｡
‫继承基类成员的类称为派生类｡
‫好吧, 这是什么意思？
‫简单地说, 如果有多个类具有相同的代码或功能,
‫但略有不同, 我们实际上可以将这些重复或冗余的代码放在一个单独的类中,
‫然后使我们的类继承自它｡
‫可以说, 这段代码可以是方法的功能, 也可以是类的属性｡
‫让我们看一个例子｡
‫因此, 我在这里创建了一个新项目, 我称之为继承演示｡
‫好的, 让我们继续看这个例子｡
‫因此, 通常当您使用多个类时, 您可以在此处创建一个新类｡
‫所以我们在这里也这样做｡
‫当然, 您可以在同一个文件中创建类, 但这不是一个好的做法｡
‫我们来呼叫班级广播吧｡
‫好吧, 我会的
‫这是一个类, 比如说广播广告｡
‫现在我们有了这个径向类, 它在同一个命名空间中｡
‫所以这两个类, 程序C是我们的main方法所在的地方, 它是我们应用程序的起点,
‫径向类在同一个文件中｡
‫所以我们要上两节课｡
‫一个是收音机, 另一个是电视｡
‫假设我们有几个属性｡
‫例如, 一个布尔值确定收音机的状态是打开的, 然后是收音机的品牌｡
‫那么是松下还是其他品牌呢？
‫然后我们这里有一个简单的构造函数, 所以你肯定应该对类的核心概念有一个了解｡
‫如果你想完全理解继承, 我建议你在学习继承之前先理解它,
‫因为它是建立在彼此之上的｡
‫好吧, 我会的
‫所以我需要两个方法因为这基本上就是函数.
‫因此, 一种方法是打开收音机, 另一种方法是关闭收音机｡
‫因此, 您可以使用这两种方法打开和关闭收音机或将其打开｡
‫然后我们将有另一种方法, 这将允许我们听收音机｡
‫我们有一个方法叫做Listen Radio, 它会检查.
‫收音机现在开着吗？
‫那么这个布尔值是在属性上的吗, 它会是真的吗？
‫如果这是真的, 那么我们可以收听广播, 我们将通过控制台红线声明来指示我们正在收听广播,
‫表示正在收听广播, 否则,
‫我们将打印此错误消息, 表示广播已关闭, 请先打开它｡
‫好吧, 我会的
‫所以在我们听之前, 我们需要把它打开｡
‫好吧, 我会的
‫这就是我们的无线电了
‫现在, 假设你有另一个类, 它是｡
‫电视｡
‫因此, 让我们继续创建一个新类｡
‫因此你可以在这里添加, 然后添加类, 并给予这个类命名.
‫我打算叫它电视｡
‫现在在这节课上, 我将继续讨论一些性质, 和我们在这里讨论的性质类似｡
‫基本上, 我还将显示状态是打开还是关闭｡
‫所以让我们把这两个属性加起来｡
‫然后我将有一个简单的构造函数, 它允许我在创建一个新的TV对象时设置这些值｡
‫这里pull和string brand都是开的, 它设置了属性｡
‫然后我会有个别的其他方法, 这样我就可以打开电视, 然后把它关掉, 类似于我在收音机里做的,
‫这样我就可以基本上复制这个代码｡
‫但这将略有不同, 因为我们有评论说, 电台在这里, 但现在这将是电视｡
‫所以这个方法将打开电视, 这个方法将关闭电视或关闭电视｡
‫因此, 我们只需要有另一种方法, 这将允许我们看电视, 它会做一些非常类似于我们的收音机做什么｡
‫它允许我们只有在电视开着的时候才能看电视｡
‫如果它是关闭的, 我们需要先打开电视｡
‫好了, 现在我们有了这两个类, 如果你仔细看, 它们非常相似｡
‫所以有很多东西是完全一样的, 基本上是因为这个属性和这个品牌一样, 它们是一样的｡
‫我们在两个类中都有它们, 所以基本上我们有冗余代码｡
‫我们不得不复制和粘贴一堆代码, 它或多或少是一样的｡
‫那么, 我们如何才能使它不需要复制和粘贴大量的代码, 重写代码, 基本上有冗余的代码？
‫这就是继承概念的全部意义｡
‫所以遗产来拯救｡
‫我们可以通过创建第三个类来解决这个问题, 称为电气设备｡
‫这将包含我们所拥有的电气设备的所有共享功能和属性｡
‫让我们来看看这些｡
‫我们拥有的那些是一样的吗？
‫那么, 我们的电视和收音机有哪些相同的特性？
‫在我们的例子中, 实际上是所有的属性, 但它不一定是所有的属性｡
‫在这种情况下, 这将是因为我们没有更多的属性｡
‫但是我们拥有的两个属性是一样的｡
‫因此, 在电视和广播中, 品牌都是存在的｡
‫所以我们的新类应该有这两个属性, 然后我们有两个方法,
‫允许我们打开电视, 打开收音机, 或者关闭收音机, 同时关闭电视.
‫所以对你来说, 如果你想尝试这个, 需要做一点练习, 因为我假设你在这一点上不是一个专业的编程人员,
‫但是当你尝试这个的时候, 你会感到更自信｡
‫因此, 继续创建一个类, 它具有所有这些属性和方法, 我们可以在这两个类之间共享这些属性和方法,
‫在一个单独的类中创建它们, 并将该类称为电气设备｡
‫实际上, 你可以随便叫它什么, 但我会叫它这样的电子设备｡
‫好吧, 我会的
‫所以我希望你通过视频, 并尝试它｡
‫我将创建一个新的类, 当然, 你可以使用快捷方式控制case,
‫我们就这么做吧.
‫在这种情况下, 控制KC和这个将打开这个窗口, 让我把它改为电气｡
‫像这样掐着｡
‫现在这个类将拥有我们在其他两个类之间共享的属性｡
‫所以让我把它们放在这里｡
‫确定电气设备状态的布尔值, 它是否打开？
‫然后是设备的品牌｡
‫当然, 我们还需要一个构造函数｡
‫因此, 电气设备已打开｡
‫布伦特, 最后我们有函数, 也就是方法｡
‫所以只要你有功能, 你就把它们放进方法里, 功能就是打开或关闭某个东西｡
‫因此, 无论何时, 当类或所使用的对象发生操作时, 都需要使用方法｡
‫这就是我们要做的｡
‫所以我们使用一种方法来打开某个东西, 在这个例子中是电子设备, 然后关闭它, 或者先打开再关闭｡
‫好吧, 我会的
‫这就是我们现在要做的｡
‫现在我们在一个类中有了共享的属性和方法,
‫让我们让TV和Radio类中的另一个类继承这个类, 或者换句话说, 扩展这个类｡
‫这是一个不同的术语｡
‫因此, 我们的电视机和收音机现在将扩展电气设备类｡
‫那么我们如何才能做到呢？
‫好吧, 我们从收音机开始吧, 因为电视会做好的｡
‫给你一个小小的挑战
‫什么？你说什么？
‫你得自己动手｡
‫所以这里你用冒号,
‫然后你想从电气设备继承的类的名字是我们的无线电现在要继承的类, 或者我们的无线电要扩展电气设备类的功能｡
‫好吧, 我会的
‫冒号, 然后是要扩展的类的名称｡
‫重要的是, 这个类必须在同一个命名空间中, 或者你必须在这里添加命名空间.
‫所以在我们的例子中, 我们没有使用任何一个,
‫我们只是使用system, 但是因为我们在同一个命名空间中, 所以电子设备说class和radio和TV在同一个命名空间中｡
‫我们可以这样做, 但是现在我们可以看到布尔值在这里有一个警告｡
‫所以当你把鼠标悬停在你的ID上时, Visual Studio会告诉你Radio DOT是隐藏的,
‫继承的成员电气设备是使用新的关键字的, 如果隐藏是有意的｡
‫基本上我们使用了相同的属性名, 这里你要避免这样, 因为你已经有了这个属性, 可以说,
‫因为你是从电气设备继承的｡
‫所以现在你可以隐藏它或者用你在这里创建的这个来覆盖它如果你想用完全相同的名字, 但是它的行为应该有所不同,
‫然后你可以这样做｡
‫当然, 即使这不是好的实践, 也必然取决于用例｡
‫这是因为现在radio类包含了两个同名的属性, 我们要隐藏或覆盖它们｡
‫这是另一个术语｡
‫我们从电气设备类继承的属性｡
‫因此, 我们将删除不再需要的冗余代码｡
‫所以我们把它去掉吧｡
‫当然, 冗余代码不仅仅是分配或创建属性, 还包括这些方法｡
‫所以让我们把这些也去掉吧｡
‫现在, 这里出现了另一个错误, 即无线电构造函数似乎存在问题｡
‫它表示没有给出与所需形参相对应的参数, 即on of electrical device, electrical device,
‫pool string｡
‫那么这个电气装置或电气装置是什么呢？
‫泳池线就是这条.
‫是这个建构函式｡
‫由于我们的属性来自基类, 并且基类包含一个构造函数,
‫因此我们可以使用base关键字来传递基类｡
‫它是构造函数参数, 因为这是我们仅有的两个属性, 而且子类中的构造函数体是空的.
‫所以这是一个很多的谈话｡
‫但基本上这意味着,
‫因为我们的无线电构造函数并不比基本构造函数复杂, 我们可以直接说基本构造函数, 这里是品牌构造函数｡
‫就像这样｡
‫我们的无线电也不需要人了｡
‫因此, 此构造函数基本上会说,
‫请传递is on以及传递给radio对象的品牌属性, 在创建radio对象时, 将其传递给electrical device构造函数,
‫因为基本上我们的radio是从electrical device继承的, 因此我们可以这样做, 这样我们就可以将其传递给electrical device｡
‫它将根据传递的值设置属性和品牌｡
‫所以这是｡
‫更复杂的部分｡
‫但是这里的力量是我们不需要构建冗余代码, 而且工作已经为我们完成了｡
‫因此, 它确实为我们节省了大量的时间和编写代码｡
‫在后面的例子中, 我们将看到如何使用子类中的构造函数体来初始化它自己的唯一属性｡
‫在这里再次强调一下广播课｡
‫是我们班的孩子｡
‫所以继承类和电气设备是我们的父类｡
‫所以基础类｡
‫所以我们要继承｡
‫所以我们的收音机是从电器继承来的｡
‫因此子级继承自父级｡
‫基本上, 你的父母有一定的DNA, 你有相同的DNA, 但你有一点更多的, 可以这么说｡
‫所以你可以这么想｡
‫好吧, 我会的
‫现在给你们一个小小的挑战｡
‫调整TV类别, 让它也继承自电气装置｡
‫所以暂停视频试试看｡
‫好吧, 我会的
‫我希望你试过了｡
‫所以首先我们需要添加结肠电装置｡
‫然后我们可以去掉冗余代码｡
‫重复的代码, 因为我们已经在基类中有了, 这意味着我们也可以在TV类目录中使用它｡
‫现在我们也可以在这里进行调整, 我们将把数据传递给基类｡
‫当然, 我们也不需要在这里设置它｡
‫但正如我在后面的例子中所说的, 我们将看到我们如何仍然可以有效地使用身体, 这将是基本的｡
‫现在, 我们可以直接转到程序CSV文件, 并在此处实际检查代码｡
‫通过检查我们的代码, 我的意思是创建我们的无线电对象并测试它｡
‫那么, 让我们继续, 在radio对象中创建｡
‫我把这个叫做我的无线电这将是一个新的无线电对象｡
‫现在, 当然, 我需要传递它是否打开｡
‫所以我会在一开始就把它关掉, 我会说它将由索尼制造, 所以品牌将是索尼｡
‫现在我可以访问属性了｡
‫你可以在这里看到这个工具项, 我的收音机的属性, 这是品牌, 是自己的属性,
‫我还可以访问IT方法｡
‫所以, 打开, 关闭, 听收音机｡
‫你还可以看到, 有些方法我们从未创建过, 它们是从一开始就存在的,
‫因为每个类都继承自对象类, 而对象类有两个字符串方法, 一个get类型,
‫get hashCode和equals方法.
‫所以这些方法, 它们存在于你用C,
‫sharp创建的每个类中, 因为基本上我们看不到它, 但在内部它是从对象类继承的, 就像这样.
‫所以每个类都继承自对象类这就是为什么我们有这些不同的方法.
‫但现在让我们首先打开它｡
‫给你, 打开｡
‫这将打开我们的收音机, 现在我们可以听我们的收音机了｡
‫所以听听我的收音机｡
‫小不点, 听着｡
‫无线电
‫现在让我们运行这个程序, 这样我们就可以收听广播了｡
‫这样我们就可以听收音机了｡
‫所以我们打开收音机｡
‫现在我们不要打开收音机, 听收音机｡
‫它会说无线电已关闭｡
‫先把它打开｡
‫好的, 现在我们对电视机做同样的事情｡
‫让我们继续创建一个TV对象｡
‫我要调用我的电视上的这个对象, 它将是一个新的电视对象, 这个对象也将被关闭｡
‫而且它将是一款三星设备｡
‫现在让我们继续, 用我的电视点开关来打开它｡
‫然后我们调用“看电视”方法｡
‫麦克麦克
‫现在让我们运行这个程序, 我们会看到现在我们的电视是开着的, 我们一边看电视, 一边听收音机｡
‫所以这是一项艰巨的任务｡
‫但基本上我们的代码做我们想做的事情｡
‫现在你可以看到, 我们把收音机和电视机的开关方法称为“打开”方法｡
‫即使我们看一下TV类, 它没有这个方法, 所以它没有一个switch on to well, switch
‫on或switch off方法｡
‫收音机也没有这些方法,
‫但这是因为它们是从电子设备继承的, 电子设备有这些方法, 我们可以使用它｡
‫所以基本上我们在这里使用的方法｡
‫基底类别｡
‫所以在这里｡
‫基类的方法｡
‫这里我们用的是子类的方法｡
‫因此, 这个switch on方法来自父类, 而watch TV方法来自子类｡
‫所以现在我们可以创建这个类特有的代码, 它不是重复的, 可以说,
‫直接在电视类和收音机类中｡
‫但是, 所有与电气设备相关的相同内容, 我们都可以在这里创建｡
‫继承还有很多内容, 当然我们会在本章中深入探讨.
‫下一段视频再见｡