‫欢迎回到多态性示例｡
‫在这段视频中, 我将使用一种不同的方法, 首先你会遇到一个小挑战｡
‫您应该编写一些代码, 这将有助于您进一步或更好地理解继承｡
‫然后我们将进入多边形, 成为整个程序的一部分｡
‫所以请继续并尝试根据此处的挑战编写代码｡
‫所以暂停视频并尝试｡
‫好吧, 我会的
‫我希望你试过了｡
‫所以我将创建一个新的class艾德类, 我将它命名为car｡
‫而这门课只是一门普通的汽车课｡
‫它可以包含或者应该包含属性｡
‫好吧, 我知道了
‫正如我所说的, 它应该有一个属性称为惠普道具, 它应该是一个整数, 惠普将是马力｡
‫那么这辆车的动力有多强呢？
‫还有另一个字符串类型的属性, 颜色是什么？
‫现在我接下来需要的是一个构造函数｡
‫所以我打算创造一辆公共汽车, 它采用了惠普和颜色｡
‫这里我把这个点HP设为HP, 把这个点颜色设为颜色｡
‫所以这个颜色是我们的属性颜色, HP是类的HP, 或者是我们的对象的HP,
‫它是在汽车类型之外创建的｡
‫现在, 下一个应该是show details方法｡
‫所以公开作废显示细节｡
‫在这里我们只需要在控制台上写些东西｡
‫因此, CW､ HP将加上HP｡
‫然后我们有了颜色, 应该是和颜色差不多的东西｡
‫当然, 我可以用不同的方法, 在这里使用字符串操作, 但我还是要这样做｡
‫很简单的｡
‫所以下一个是公共空白, 它被称为修复｡
‫我们稍后会改变这两种方法｡
‫所以不用担心｡
‫但现在, 我想让他们保持非常简单｡
‫通过我们到目前为止使用的方法, 这将使多态做什么更清楚, 这里只说汽车被修复了｡
‫好的, 这是我们的车, 这是我们的基类｡
‫现在我们需要另外两个级别, 这是我们的宝马, 宝马级别｡
‫在这里, 正如我所说的, 我们有一个额外的属性, 称为模型, 这是一个字符串模型｡
‫另外一个方面是品牌, 它是一个私人会员｡
‫所以私串的牌子就叫宝马｡
‫接下来我们需要一个构造函数, 一辆公共宝马｡
‫在此之前, 在创建构造函数之前, 我想从car继承｡
‫所以现在我的宝马车要继承汽车｡
‫这里我需要的是HPP,
‫然后是颜色和型号, 这里还有逗号｡
‫因此, 我可以将HPP设置为HPP, 实际上, 我甚至可以继续对颜色进行同样的设置｡
‫它将是颜色和模型, 这是我们的财产应该是模型｡
‫这里, 这里, 我用这个, 因为我想把它用于这个对象,
‫同样的事情我在这里和这里都能做｡
‫因此, 即使我没有在这里创建这些, 如您所见, 我仍然可以使用它们｡
‫现在, 这里有一些你们还没看到的东西, 这是基本的｡
‫所以我可以在这里使用base关键字, 然后我可以简单地说, 好的, 我想使用HPP和我的基类的颜色,
‫然后我不再需要这两行了, 所以我甚至可以把它们去掉｡
‫现在您可以看到, 错误也消失了｡
‫现在我们已经创建了一个构造函数, 它使用了基类的构造函数, 也就是基类,
‫也就是汽车.
‫它只需要使用这个构造函数, 然后添加模型.
‫所以现在我们有一个非常短的构造函数, 它完成了所有的工作, 所有的工作｡
‫所以现在我接下来需要的是一个void显示细节, 就像我说的｡
‫在这里我只想展示细节, 我只想从这里复制方法或者方法的入口｡
‫在这里, 它将是品牌第一｡
‫所以品牌加品牌加惠普｡
‫现在, 我们将显示一些其他细节｡
‫在这里, 正如你所看到的, 显示细节, 隐藏, 继承成员汽车显示细节, 使用新的关键字,
‫如果隐藏是有意的｡
‫我们将在下一个视频中介绍这一点｡
‫不过现在, 我们也创造出修复法, 公共虚空修复｡
‫这里应该写着“宝马”之类的东西, 这里是修好的｡
‫那么这个零是什么
‫嗯, 这就是模型｡
‫所以我只想知道车的型号, 我只想说, 让我们说宝马, Z, Phi,
‫az4或MX三或MX五被修复｡
‫这就是它的作用｡
‫现在我需要另一个, 另一个类, 这和我们这里的很相似｡
‫我将创建一个新类, 命名为Audi.
‫为了简单起见, 我会复制这里的大部分内容, 实际上, 整个类, 因为它们非常相似｡
‫不同的是, 这是一辆奥迪, 我们有奥迪作为构造函数, 当然它需要继承自汽车｡
‫现在完成了, 接下来是多态性部分｡
‫所以我们有一辆奥迪, 它是汽车类型的, 我们有一辆宝马, 它也是汽车类型的｡
‫我们有一个基类car, 现在我们可以创建多个对象｡
‫等我们到了那里就更有意义了｡
‫我们来创建一个名为汽车的新变量, 它将是一个新的汽车列表｡
‫尽管这是一个汽车列表, 所以汽车类, 我们可以创建所有这些, 宝马在这里｡
‫所以我们可以创造出一辆蓝色的奥迪, 它是一辆A4｡
‫然后我们有一个新的宝马, 让我们说250马力, 让我们说是一个红色的汽车, 这是一个MX三｡
‫这是多态性的一部分, 你可以用子类来代替基类, 或者用派生类来代替基类, 比如, 用列表,
‫或者一般地说, 一般地说, 你会明白我的意思｡
‫我接下来要做的就是运行一个for each循环,
‫它会检查汽车列表中的所有汽车.
‫它只会写一些类似汽车修理的东西或者调用一个修理方法｡
‫好吧, 我们跟注或者下注｡
‫但在此之前, 我们需要控制正确的键｡
‫因为否则我们的项目就会关闭｡
‫所以你在这里｡
‫车修好了｡
‫所以现在它调用了car方法｡
‫这是哪一个？
‫车修好了｡
‫所以它没有调用这个修理方法, 也没有调用这个修理方法, 它是宝马被修理过的,
‫或者它是实际上它应该是音响或奥迪｡
‫奥迪车修好了｡
‫那么现在为什么它叫我们的车的维修方法, 而不是宝马和奥迪的维修方法, 这与两件事有关｡
‫其中之一是我们有这个虚空修复, 这不是一个虚拟的｡
‫所以如果我们把它变成虚拟的虚空修复, 我们现在可以做的是, 比如说, 我们可以覆盖它｡
‫所以现在我们可以覆盖修复方法｡
‫如果我们再运行一次代码, 就会发生这种情况｡
‫我们会看到的｡
‫车修好了｡
‫那是我们的奥迪, 第一辆｡
‫然后宝马M三被修好了, 这是第二辆｡
‫这是因为我们的宝马级在这里已经覆盖了维修方法｡
‫所以我们可以简单地使用这个方法, 使它成为虚拟的, 这样我们就可以在派生类中覆盖它｡
‫这就是我们所做的｡
‫所以现在有了多态性的两个方面｡
‫因此, 多态网络一, ODI和大众, 保时捷,
‫无论你想有什么不同的类都可以用在任何地方的汽车预期｡
‫所以每当它们从这个类继承时, 从我们的car类继承时, 我们可以直接用它来代替.
‫多态的第二个方面是, 虚拟方法可以在每个派生类上调用, 而不是在基类上｡
‫这就是我们对宝马所做的事情, 现在我们可以对这里的订单做同样的事情｡
‫所以我也要把它作为一个覆盖｡
‫覆盖､ 作废､ 修复｡
‫现在让我们再运行一次｡
‫现在, 双方都应该展示自己的品牌和车型｡
‫所以我们看到奥迪A4和宝马M3被修复｡
‫不过, 关于多态性还有一件事｡
‫因此如果要用新成员隐藏基类成员, 可以使用new关键字｡
‫假设我们的类car中有一个void, show details方法, 它只是一个void.
‫它不是虚拟的空白｡
‫现在如果我想覆盖它, 那么就不要像我们在这里做的那样覆盖它｡
‫但实际上, 每当我使用宝马时, 我都想使用这种方法, 而不是覆盖旧的方法,
‫而是将旧的方法隐藏起来, 使用显示细节来代替｡
‫我可以使用new关键字｡
‫它只会简单地说, 好的, 这个车展细节优先于车展细节｡
‫所以它不是覆盖它, 而是重新安排它的优先级｡
‫那我现在该怎么开枪？
‫显示此显示详细信息方法还是使用此显示方法？
‫好吧, 让我们创建一个新的宝马pmwz3, 这将是一个新的宝马汽车与200马力｡
‫让我们把它变成黑色｡
‫然后是az3型号｡
‫然后让我们也创造一个奥迪, 奥迪一个三｡
‫这将是一个新的奥迪, 让我们说, 100马力｡
‫这个是绿色的｡
‫车的颜色很奇怪｡
‫然后你有一个三模型在这里｡
‫现在, 让我们运行宝马, 并在这里显示详细方法｡
‫奥迪也是一样｡
‫奥迪｡
‫A三表示详细信息｡
‫所以我们就运行它吧｡
‫你看惠普200, 黑色惠普100, 绿色｡
‫正如你所看到的, 它调用的是车展细节方法, 而不是宝马的方法｡
‫这是因为我们把它作为一辆汽车来创造, 但它是一辆新的宝马汽车｡
‫所以如果我们现在做同样的事情, 让我们继续创造一个宝马MX 5, 这将不是一辆汽车,
‫但这次它是一个B, M W新宝马, 这一个, 让我们说, 有330马力｡
‫是白色的MX 5
‫所以现在如果我把这个叫做B M W MX五点显示细节的方法, 它会显示出我的品牌, 也就是说,
‫我们的品牌是宝马, 惠普330颜色白色｡
‫还有第一批｡
‫这里的那些｡
‫他们还必须显示详细的方法, 但他们使用的是汽车, 现在宝马一个使用宝马的一个｡
‫所以即使我们说了new BMW, 我们仍然使用car类来创建一个car对象,
‫这个对象在内部是一个BMW, 但是我们调用汽车方法, 而不是BMW方法,
‫只有当我们继续创建一个称为new方法的BMW时｡
‫所以这个new, 它只是简单地说, 如果你创建了一个我的对象, 那么就把它写成new.
‫如果你不知道, 那就直接用汽车的方法或者用car类的方法和基类｡
‫但是, 如果我想在我的BMW对象上调用基类的show details方法, 该怎么办？
‫然后我可以做以下事情｡
‫我可以继续创建一辆车, 我将其命名为车B, 它将是一辆宝马m 5｡
‫但它会是｡
‫一辆车｡
‫这里我使用了铸造, 这样我就把我的宝马铸造成了一辆车, 现在我可以继续使用车b点显示我的宝马MX
‫5的细节｡
‫或者我的车是这样, 我们再次hpp330颜色白色｡
‫这就是我们的宝马m五｡
‫那么, 为什么你甚至会使用这种方法隐藏和使用这个新的关键字在这里对您的成员？
‫如果您希望派生成员与基类中的成员同名,
‫但又不希望它参与虚拟调用, 则可以使用它｡
‫这就是我们在这里看到的这个新关键词｡
‫否则, 如果要重写它, 只需在此处使用这个override方法,
‫或者在方法声明中使用这个override关键字｡
‫好吧, 我会的
‫所以这是相当了不起的多态性｡
‫在下一个视频中, 我们将了解如何防止这种情况｡
‫所以如果你不想一个方法被覆盖｡
‫在我们的基类中有一种方法可以做到这一点｡
‫下一段视频再见｡