Oop 多重继承的确切问题是什么?

我可以看到人们一直在问,下一个版本的C#或Java是否应该包含多重继承。有幸拥有这种能力的C++人说,这就像是给某人一根绳子,最后挂上自己。 多重继承有什么问题?有混凝土样品吗 假设对象A和B都是由C继承的。A和B都实现了foo(),而C没有。我称之为C.foo()。选择哪个实现?还有其他问题,但这类问题很严重。tloach的例子很好地总结了多重继承的主要问题。当从实现同一函数或字段的多个基类继承时,编译器必须决定继承哪个实现 当您从多个继承自同一基类的类继承时,情况会更糟。(菱形继承,如果绘制

Oop 建模与责任

假设您希望在应用程序中创建银行帐户的模型。您可以创建一个类BankAccount,它执行典型银行帐户的操作。但如果你被问到班级的责任是什么,答案是什么?”表现得像个银行账户?“这不是很具体。 我对模特和责任之间的关系有点困惑。许多“真实世界”对象似乎没有明确的责任 开始对这些概念建模并保持明确责任的最佳方式是什么?我脑海中没有的银行账户责任示例: 维护账户持有人信息 维护交易清单 提供当前余额 把“像银行账户一样行事”的含义拆开。银行账户可能需要能够: 记录里面有多少钱 向具有正确权限的人(

Oop 过渡到OO ABAP?

似乎我们的大多数SAP程序员都在使用旧版本的ABAP,即面向对象之前的版本。我还注意到,使用OO时,该语言更干净、更现代(他们显然抓住了摆脱不推荐的东西的机会) 由于该系统尚未推出,因此现在是重新设计的时候,而不是以后 是否值得要求将新代码编写为OO ABAP程序?如何向管理层推销?与非面向对象程序的接口是否工作良好 (更新后注意到,我是专门谈论新代码的,特别是计划在明年使用的新代码)如果它在生产中起作用,请不要重写代码。不值得花时间或金钱,也没有任何管理层(在一家足以运行SAP的公司)会同意这

Oop 多个子对象的一个父对象

是否可以将一个父对象用于多个子对象,以便所有子对象都可以共享相同的父对象状态?是的,这是可能的。我有一个ArrayList类,ArrayList实际上是一个普通数组,但我只允许对象在其中 请看一看Microsoft的ArrayList类,我的基于该类。可能会对您有所帮助。或者不是。要得到更具体的答案,请让您的问题更精确,最好是描述您的实际用例。如果您的子类派生自父类,那么子类就是父类。如果创建两个子对象,则它们是独立的对象,并且它们的父“部分”是独立的。这不是你想要的效果 我假设你想要的场景是可

Oop DDD图书,埃里克·埃文斯:“什么是”的意思;工厂应抽象为所需的类型,而不是创建的具体类;?

Eric Evans在《领域驱动设计》一书中的第6章“工厂”一节(第139页)中指出: “任何好工厂的两个基本要求是: "二,。工厂应抽象为所需的类型,而不是创建的具体类。” 请您详细说明一下关于基本要求2的声明是什么意思。我认为这意味着您永远不应该从工厂退回混凝土型号 例如,如果你有一个接口,比如说ISomething,一个抽象类SomethingBase,最后是一些实现这个接口并从基类继承的类。你的创建方法应该返回接口类型,而不是基类。我想这就是想法 public ISomething C

Oop 大类重构规则

这是与我几分钟前提出的一个问题有关的另一个问题。如果我有一个我认为只有一个职责但有很多业务规则的类,而且该类很大,大约4000行或更多,那么不将该类重新划分为多个类就可以了。一个4000行的类不太容易维护。孤立地测试逻辑片段可能很困难。将其拆分的一个更实际的原因是,如果将其拆分为多个类,则多个程序员可以并行处理它。如果是一门课,这就很难做到 如果将其作为一个整体怪物,您将失去许多良好的软件质量属性。有更好的模式可以降低其内在复杂性,即使它确实是内聚的。我会说“不”。4000行太大了 我会检查业务

Oop 删除if is语句的设计选项

假设我有一个域对象的类层次结构,有一个基类和两个子类,一个级别 假设我有一个这些对象的列表(基类的列表),我想对我觉得不属于这些类的类应用一些逻辑(例如,特定于设计/用户界面的代码) 我的选择是什么 如果是语句。就个人而言,这本书甚至不应该被视为一个替代品,但我还是写了它 多态性。在某些情况下,这实际上是另一种选择,但在我上面的示例中,我不希望我的类包含任何UI细节 根据对象的类型,通过反射/IoC容器解析某些逻辑方法。 例如C#。Type Type=typeof(ILogic).MakeGen

Oop 如何命名我的枚举元素?

我在命名应用程序数据模型中的元素时遇到问题 在应用程序中,用户可以创建自己的元模型。他通过创建实体类型和类型来定义实体具有哪些属性。但是,有三种实体类型: 该类型始终只有一个实例。 例如,我想为我工作的公司建模。它有一个名字、一个股价和一批员工。这些价值观会随着时间的推移而变化,但总有一家公司 该类型有不同的实例,每个实例都是唯一的。 例如:城市。一个城市有一个名字和人口,有不同的城市,每个城市只存在一次 该类型的每个实例定义多个实体。 例子:汽车。汽车有颜色和制造商。但不止一辆红色奔驰。尽管它

Oop “的概念背后的总体思路是什么;上下文“;在编程方面?

特别是网络编程?我习惯于过程编程,但我一直在使用(并且非常了解)一些复杂的面向对象php。他们一直在谈论的一件事是“传递上下文”或“设置上下文”。我假设这个上下文概念将适用于比php更多的语言,以及web编程以外的更多领域,正如我在讨论其他语言时听到的那样 我认为这是关于:传递阵列或传递自行车。在OO语言中,您将反映现实生活中的情况,并检查如何在那里创建某些东西 我有一个游戏的例子: 我们给这个游戏角色一个角色好吗 运动控制器?还是应该有 有没有一个静态管理器可以做到这一点 为了我们?我们最终选

Oop 物体的构成

我有一个班,担任经理,做一些工作。 当应用服务器启动时启动的servlet将实例化此管理器。 我需要添加另一个类来完成其他工作,并且需要与经理协调。 我正在考虑将该类作为实例变量添加到管理器中。 我应该让管理器实例化新类(如在构造函数中),还是让servlet实例化新类并在管理器实例化后调用manager.setNewClass()。为了正确地进行解耦,您应该创建一个定义管理器期望的行为的接口,然后通过控制/依赖注入的反转提供一个实现。这将允许您单独测试管理器及其工作类(我称之为委托,但可能不是

Oop 面向对象设计实践问题

在过去的几年里,我几乎只开发C代码。我目前正在学习我的面向对象设计技能。有谁能推荐一些资源,这些资源包含一组简短的面向对象设计问题,并提供一些可能的解决方案/分析?理想情况下,我想要一个足够小的问题,可以在面试中草拟并设计一个问题,可以在15-30分钟内完成/分析 谢谢 看看我对下面两篇文章的回答 第二个链接不工作请尝试以下操作:

Oop 在特定时间范围内有效的业务规则–;如何有序管理

我刚开始为一家政府机构工作,我遇到了一个有趣的问题:商业规则取决于立法机关,因此它们必须尊重立法机关活动的确切时间段 举个例子,如果受试者在某一日期申请了补贴,则必须根据vas在该日期有效的标准对其进行评估。对于后来申请的人来说,同样的补贴有不同的标准。 我想知道是否有一种已知的模式可以有序地处理这些依赖时间的规则。目前,代码中充斥着类似以下的表达式: if application.date>“2008年7月17日” 处理此问题的最佳方法是什么?这似乎是一个很好的例子。每个立法机构都会有处理人。

我们如何确定一个对象';OOP中的责任是什么?

我刚开始学习OOP,我发现很难决定功能属于哪里。让我们使用一个down投票,以便为我们的示例: 当我们强制转换时,事务中必须发生以下情况: 减少投票者的rep和downloves计数 减少收件人的重复次数 降低post得分 所以 我们如何确定哪个动作属于哪个对象 这样的功能在哪里?在DAO层、服务层还是实际对象本身 当对象彼此交互时,它变得越来越棘手,例如在我的示例中。通常很难决定什么函数属于什么对象等等…这不是一个容易回答的问题,听起来更像是一个设计模式问题,而不是OOP问题本身。在SO的情况

Oop 面向对象设计问题

假设有两个类:A和B A可以在B上操作 我需要能够查询A已操作的所有B实例 对于一个特定的B实例,我需要能够查询对其进行操作的所有a实例 这类问题的优雅解决方案是什么(在OO品味中?import java.util.*; import java.util.*; class A { void operate(B b) { operatedOn.add(b); b.operatedOnBy.add(this); } final Set<B

Oop 我应该如何处理非';不一定是类属性,但被几个方法使用?

我偶尔发现自己在一个类中有几个方法都需要相同的数据(例如,一个查询对象)。通常,会有一个公共方法,其通用名称类似于parseReport(),它依次将工作委托给多个私有方法,并最终返回成品: public function parseReport( queryObject ) { queryObject = correctDatesAndTimes( queryObject ); queryObject = sortByCusomter( queryObject ); q

在Haskell中使用类函数OOP方法

这几天我在学习Haskell,有了一个使用函数式OOP方法的想法 首先,定义一个操作符,如下所示: (//) :: a -> (a -> b) -> b x // f = f x 如您所见,此运算符反转函数f和参数x的顺序,然后应用它。例如,等于可以定义为: equals :: Eq a => a -> a -> Bool equals = \x -> \y -> x == y comparison = (1 + 2) // equals 3

Oop 递归调用类(实现链表)

嗨,我正在尝试在Matlab中实现一个链表 我希望实现的是(这是C等价物): 我环顾了一下四周,但似乎什么也没找到 我猜您想要实现一个链表: classdef Node < handle properties Next = Node.empty(0); %Better than [] because it has same type as Node. Data; end method

Oop CRC卡是否仍用于设计您的系统?

CRC卡被称为一种简单、直观的方法 在创建系统之前对其进行模拟。 许多人用一些批评来赞扬它的优点 但我找不到关于其实际用途的好的、可靠的例子 或者是好的案例研究 YouTube仅提供了两个直接示例,说明如何使用CRC方法 都是用的-他们都不是用美国的,甚至是美国的 这种方法的创造者是两位伟大的美国人。 真有趣 所以在这里我想知道有多少人在设计过程中使用了CRC? 它仍然有效还是很好?值得花很多时间去研究、实践和投入吗?我猜这在很大程度上被UML所取代。从未听说过有人使用CRC,但我更喜欢网络而不

Oop 在理想的OO设计中,继承对象是否应该对其每个方法隐式调用super()?

也就是说,当调用child.update()时,派生类隐式的实例是否应该在调用之前调用其自身的所有超类的update()。有时我先说,有时我最后说。有时我会有条件地称之为“有条件的”,有时,我根本不称之为“有条件的” 很多时候(这来自C#背景),基类函数只是引发一个事件,子类重写该方法以获得类似事件的功能。在某些情况下,孩子不希望引发该事件: class Base { public event EventHandler UnhandledError; protected virtua

Oop 如何让用户决定通过winform注入哪个对象?

如果我有使用接口I的类X,接口I由类A、B、C实现。。。其中一个通过winform用户界面根据用户选择注入X。如何让用户决定注入的A类、B类或C类?我建议改用A类。这可能要简单得多,可读性强得多。不过,工厂本身也可能被注入 如果您真的想使用容器来解决这个问题,您可能可以使用将正确的类传递给X的构造函数(或使用常规setter)而不是使用IoC容器来解决这个问题。即使您可以使用注册工厂来解决这个问题,IoC容器也不适合这个用例。

Oop 实体集和实体之间的区别是什么?这是定义标准吗?

我想知道我的教科书是否有一个非标准的定义。我有红色的,它不是复制品。本书将实体和实体集定义为 实体是某种抽象对象,是 相似的实体形成一个实体集。实体在某些方面是相似的 面向对象编程意义上的“对象”。同样,一个实体集具有一些 与一类物体相似 当他们说“对象类”时,他们指的是一个类,就像在你实例化的东西中创建新对象一样(我知道这只是一个松散的比较)。听起来实体集比实体更通用,但在回复中指出“实体集通常表示实体数据的一个片段”,这是相反的 我认为一个实体就像数据库中的一个表,那么什么是实体集呢?在我看

Oop 有没有办法不在这个代码流中重复一个节点?

我尝试使用活动图表来描述此[pseudo-]代码: get expression while match '(' get expression if !match ')' error get term 见: 有没有一种方法可以描述该代码而不重复两次get expression节点 或者我用了一个错误的图表来描述它吗?这个图表是错误的。在每次迭代中,您将遍历两次get_expression。在第一个get_表达式下面添加一

Oop 继承示例

考虑以下代码段: class BaseClass { public void SayHi() { Console.WriteLine("Hi from base class"); } public virtual void SayHello() { Console.WriteLine("Hello from base class"); } } class DerivedClass : BaseClass {

Oop 如何创建一个";的多个实例;“对象”;在Clojure?

我可以使用哪些Clojure方法在一个对象上创建多个实例,然后将其存储在Java ArrayList中 我知道如何在Java中实现这一点,但我不确定如何在Clojure中继续,任何帮助/指针都将非常感谢为什么不存储在vector中 user=> (def lst (atom [])) user=> (swap! lst conj "String") user=> (swap! lst conj 123) user=> @lst ["String" 123] 看 返回#

Oop 设计系统、流程图或UML的最佳方法是什么?

我被分配了一项设计系统的任务,他们更喜欢流程图。但根据我的研究,我更倾向于使用UML概念进行设计。现在我有点糊涂了 首先使用用例图,然后是序列图。它们很容易开始。首先使用用例图,然后是序列图。它们很容易开始。谢谢,非常感谢。谢谢,非常感谢。如果“他们”喜欢流程图,请给他们一个流程图!他们没有问你最好的方法是什么,而是问你一个流程图。如果“他们”更喜欢流程图,给他们一个流程图!他们没有问你最好的方法是什么,而是问你流程图。。

Oop 松散耦合与类创建

我浏览了很多关于OOP原理的教程和博客。 当我理解松耦合和编写可测试类时,有一件事我犹豫不决 比如说,我有一门湖课。 lake类具有注入的依赖项,如天气和位置(策略模式等),但它创建返回的类,比如fishes 所以函数catch()返回Fish类 它是紧密耦合的吗?因为fish类有一个构造函数,它也需要进行“单元测试”?如果您直接在类中实例化fish对象,如 新鱼(); 然后,这两个类之间存在紧密耦合。如果Fish不仅仅是一个简单的数据传输对象(一个只携带数据而几乎没有逻辑的对象),那么我会避免

Oop 导入的结构方法不工作

如果我运行以下代码,一切都会编译并运行良好: package main import "fmt" type Point struct { x, y int } func (p *Point) init() bool { p.x = 5 p.y = 10 return true } func main() { point := Point{} point.init() fmt.Println(point) } 但是当我将点结构移动到

python版本3.5中的OOP?

我使用的是Python2.7,然后我听说Python3.5中有一个OOP,所以我开始使用这个版本,但我仍然不知道如何在Python3.5中创建类? 我是说类的编码是什么样子的?来自: 类定义的最简单形式如下所示: class ClassName: <statement-1> . . . <statement-N> 类名: . . . 2.7还支持OOP。我建议谷歌搜索一些教程。2.7中也有“面向对象”的功能。我建议你找一本入门教程

Oop 在TDD中使用描述性测试名称

在阅读本书时,作者告诉我们在测试中命名长名称和描述性名称,以了解被测试对象的功能。例如: 当无法连接到TSMonitoringPort()时,通知侦听器服务器不可用。 比 轮询服务器监控端口() 但大多数样式指南告诉我们要遵循80或100列规则。其他人对此有何看法?对于单元测试,您可以不受影响,因为您实际上不必直接调用这些方法。例如,您不会想要一个具有很长冗长名称的公共API,但对于测试,这也会为其他开发人员形成文档。 这是一种权衡。在这种情况下,描述性名称越多越好。这是务实的做法 就我个人而言

Oop 是不是;开放供扩展,关闭供修改”;原则有意义吗?

在我看来,鲍勃·马丁(Bob Martin)需要一些以O开头的东西来巩固,并在一些旧书中找到了这个(可能是无用的)开/闭原则 开放/封闭如何与单一责任共存,即一个类应该有一个变更的单一原因 如果我想在一个长期存在的系统中遵循开放/关闭,我是否应该拥有一个由几十个/数百个类组成的链,每个类都扩展了以前的类?开放/关闭原则意味着,您可以创建通过添加新代码而不是更改旧代码来添加新功能的系统。为了完全符合开放/封闭原则,必须具有完美的远见。因为,为了创造一个完全开放扩展、封闭所有修改的系统,一个人必须能

Oop 命令模式澄清

我看不到任何命令模式类,例如invoker、receiver在下面链接的接受答案中出现。我已经用公认的答案来解决我的30多条if/else语句 我有一个存储库,我正试图通过DTO保存到数据库中。我希望存储库为DTO调用正确的save方法,以便在运行时检查实例类型 下面是存储库中的实现 private Map<Class<?>, Command> commandMap; public void setCommandMap(Map<Class<?>, Com

Oop Go中方法参数的继承替换

我明白围棋没有继承性,只能用构图来创作 以下是我的小例子: type Car struct { XMLName xml.Name `xml:"response"` // some properties coming from a XML file } type Audi struct { Car // some more properties coming from a XML file } func UnmarshalFromXML(url string,

Oop 如何在dart中实现继承?

我希望有一个类继承Dart中另一个类的一些属性。最好的方法是什么 这是我的父类: class Photo { final String id; final String owner, server, secret, title; final int farm, isfamily, ispublic, isfriend; final String url; Photo( {this.id, this.owner, this.secret,

Oop 实体关系设计:相互排斥的Has-A关系

我正在为一个可以与不同类型的其他对象建立关系的对象确定最佳设计方法。但一次只能属于一种类型。相互排斥的一对多has-A关系是我能想到的描述这种情况的最好的短语 例如: 我有项目和程序。每个任务可以包含多个任务。一项任务可以属于一个项目或一个过程,但不能同时属于多个。任务可以从项目移动到过程,反之亦然 因此,在任何时候,任务都与项目有一对多的关系,或者与过程有一对多的关系 目前,我正在考虑这样一项任务: class Task(id, name, project_id, procedure_i

Oop 在父类和子类中可以有相同的抽象方法吗

我有一个问题 I两个抽象类A和B。B继承了A,所以现在我们可以有相同的抽象方法,在类B中的类A中没有实现(没有覆盖) 条件: 1.它在两个抽象类中应具有相同的名称和签名 2.我们将B继承到C类,并在C类中实现它。 3.无方法隐藏 问候 克里希纳 公共抽象类A { 公共信息(); } 公开摘要B类:A { 公共信息(); } 公共抽象类C:B { 公开资料 { //代码 } } 假设你的问题是c代码,那么以下是可能的:- public abstract class A { public abs

Oop OCP是否违反了干净体系结构中的SRP?

最近我在读罗伯特·马丁的《清洁建筑》 我对两个坚实的原则定义有一些误解。正是单一责任原则和开放/封闭原则 对于第一个,我们有以下内容 类(模块)应该只有一个更改的原因 其中,原因表示参与者。听起来很清楚 继续下一步-OCP。这里我们有这样的例子 被误解的部分是数据库和交互者的关系。我们通过财务数据映射器在数据库组件中实现财务数据网关接口,因此我们有两个模块,每个模块负责一项工作。似乎违反了SRP 我是正确的还是只是缺少了一些正确的理解?我想强调的是,列出的设计方法既不是面向对象的,也不是适合大

Oop TObjectList.DisposeOf上的指针操作无效

大家好,如果这是一个重复的,很抱歉,但我的具体问题,我还没有看到回答任何地方。 当我尝试释放运行时在以下行创建的ObjectList时,我遇到了“无效指针操作”: Prods := TItemProcedimento.Create(DM.FDQ).lerProdutos; Prods.DisposeOf; // <- Invalid Pointer Operation at 2nd iteration 为什么??我做错了什么?这个测试代码是在当前代码之前运行的,顺便说一句,可能是

什么';复制构造函数有什么问题吗?为什么要使用可克隆接口? 编程C++时,我们在需要时创建复制构造函数(或者我们被教过)。几年前切换到Java时,我注意到现在正在使用可克隆接口。C#遵循定义iClonable接口的相同路线。在我看来,克隆是OOP定义的一部分。但我想知道,为什么要创建这些接口,而复制构造函数似乎已经被删除了

当我想到它时,我想到如果一个人需要复制一个类型未知的对象(比如有一个对基类型的引用),那么复制构造函数就没有用了。这似乎合乎逻辑。但我想知道是否还有其他原因我不知道,因为可克隆接口比复制构造函数更受青睐?这是最终类型的问题,以及通过复制构造函数没有解决的超类级联克隆操作的问题-它们是不可扩展的。但人们普遍认为Java克隆机制也严重受损;特别是子类不实现clone(),而是从实现cloneable的超类继承的问题 我强烈建议您仔细研究克隆,无论您选择哪种路径—您可能会选择clone()选项,但请确

Oop 接口的功能主要是用于使用函数而不知道类是如何构建的吗?

因为我理解接口是契约,所以我将其解释为契约词,即必须具有接口中指定的内容(例如打开、关闭、读取、写入处理文件的接口) 但是我很难理解的是,为什么你需要一个接口来告诉你这个类必须能够做什么,自从你在接口规范中写了它,你就不知道了吗 我能看到的接口的唯一原因是在大型项目中,您希望能够在不真正了解类是如何构建的情况下使用类。通过了解接口需要什么,您将知道如何使用它 这让我想知道为什么我应该在项目中使用(或者如果我应该)接口,而我将是唯一一个从事这项工作的人。我很确定它还有很多我看不到的用途 我的大部分

Oop 如何识别一个对象并在它们之间建立关系[c#]

识别对象及其相互关系的最佳方法是什么? 由于我是编程[c#windows应用程序]的新手,我发现很难建立对象之间的关系。 有人能给我建议一个最好的开始方式吗 谢谢, Karthik您可能应该仔细阅读面向对象编程和设计。然后阅读C#编程 以下是一些书籍建议: 然后,当您准备好后,就可以转到=) 如果你不想买一本书,不妨看看这个。它涵盖了关键的面向对象设计原则。我将尝试用一个精心设计的示例为您指出正确的方向: 假设我们想为超市员工制作一个简单的管理应用程序。我们需要存储一些个人信息和工作相关

Oop DTO和域对象、WCF以及DB层交互

我有asp.NETMVC2应用程序。我对创建DTO和域实体感到困惑 MVC控制器集成点: 1) 第三方WCF 2) 数据库层 WCF将返回特定公司的人员信息和公司的一些信息 我已经生成了WCF的代理,并在代理上编写了一个服务包装器。 服务包装器正在与WCF通信,并将结果映射到DTO clas ContactsDTO 服务层位于不同的项目中 以下是我的域类 Company Person DTO class //it contains class ContactsDTO { Person pers

Oop ddd中的验证方法

我对ddd中的验证方法有一个问题。我读过关于这方面颇有争议的观点。有人说这应该存在于实体之外,也有人说这应该存在于实体之中。我正试图找到一种我可以遵循的方法 例如,假设我有一个带有电子邮件和密码的用户实体。用户拥有方法注册(电子邮件、密码)。电子邮件和密码验证应该放在哪里?我个人的意见是,它应该在Register()方法中。但这种方法可能会将用户类与验证内容混为一谈。一种方法可能是在单独的策略对象中提取电子邮件和密码规则,并仍然从Register()方法调用它们 您对DDD中的验证方法有何看法?

Oop 我们可以在没有封装的情况下进行抽象吗?反之亦然?

我在一次采访中遇到了这个问题。我回来后在这里读到了这篇文章,偶然发现,和,还有许多其他的重复文章都说了几乎相同的话 我知道一般定义早于它们在编程语言中的实现。我还知道编程语言(我说的是Java)尽量将这两个定义分开。例如:Java将class视为封装,因为它提供了一个包装器来保存所有类似的数据;而接口是一种抽象 但我真正想知道的是这两个定义是如何重叠的是两个子集,重叠或完全不相交的集合。我知道这些定义将wrt更改为泛型定义和特定于语言的定义,因此如果可以,请同时回答这两个问题,或者至少提及您正在

Oop 服务中的实体关系

我有这样的模型关系:用户,任务,每个用户都可以创建自己的任务,并且可以查看所有任务。所以很明显,我将使用带有方法的TaskService,getSortedTasks(字符串值),等等。 我不知道在哪里应该有createTask(Task Task),updateTask(lond id,Task Task)方法-在TaskService或UserService中,因为我被告知应该有REST API,看起来像: 相当于 post users/{id}/tasks 因为“任务属于特定用户”。因

上一页   1   2    3   4   5   6  ... 下一页 最后一页 共 124 页