- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
过去几周我一直在努力学习 OOP,我学到了很多,但我不确定这一点,我的类层次结构应该是什么样的?
假设有两个类,这是一个Level
类:
class Level(object):
def __init__(self, level, exp):
self.level = level
self.exp = exp
@property
def required_exp(self, level=None):
return 80 + 40 * (level or self.level)
def add_exp(self, exp):
self.exp += exp
while self.exp >= self.required_exp:
self.exp -= self.required_exp
self.level += 1
显然它还有一些其他方法,但这是基本思想。
现在第二个类叫做Player
。它有一些属性,比如:name
, health
, level
, experience points
, damage
等
到目前为止我所学到的(SO 上的某个人这样说)是在我不确定是使用继承(is-a
-relationship)还是属性( 有一个
关系)。问题是:Player 是一个 Level,还是 Player 有一个 Level?
嗯……两者都不是。Player肯定不是一个级别,这一点我敢肯定。Player 有它的级别,但级别不等于 Level
类。相反,Player 具有等级和经验值,它们都是 Level
类的属性。您还可以向 Player 添加经验值,因此从 Level
继承它是有意义的。
作为旁注,这些命名对我来说也没有任何意义。有这样的东西是有意义的: Level.increase(self)
将 Level 增加一个。然而,对于玩家来说,调用 Player.level_up(self)
会更有意义,就像在大多数(所有?)角色扮演游戏中所使用的那样。调用 Player.increase(self)
没有任何意义,您不能将 Player
增加一个,而是将其级别增加一个。再一次,调用 Level.level_up(self)
也没有多大意义......
因此,我认为我应该像使用接口(interface)一样使用 Level
并从中继承 Player
(和其他子类),但我不确定是否如此我决定问你,反正我是来学习的。我应该怎么办?将 Level
与 Player
一起使用的最正确方法是什么?
最佳答案
我相信我就是让你问自己这个问题的人:“A 类是 B 类,还是 A 类有 B 类?”,所以我觉得我必须回答这个问题。
我不能 100% 确定您的关卡实际作用是什么,但我假设它与《口袋妖怪》、《魔兽世界》、《英雄联盟》和数以千计的其他游戏中使用的关卡类似。如果是这样,您的 Level
类就已经出错了,它不应该是那样的。
你肯定在一件事上是对的;“玩家肯定不是一个级别的”正如其他人已经提到的那样,您应该选择 has-a 关系。球员确实有水平,我们都知道这一点。但是,你告诉我玩家没有 Level
类型的属性,而是一个整数 level
属性来保存你的 Level 的数值
-类。
这应该已经敲响了一些警钟,但这里有一个提示:它与具有一个名为 name 的
在里面。string
类型属性的 Name
类是一样的
所以答案是:Name
类本身应该已经是一个字符串,它应该继承自 string
,而不是在其中包含一个 string
属性来保存它的值。这同样适用于您的 Level
,它本身已经是一个整数,因此从 int
继承它,然后添加 exp
及其方法。
现在您可以使用player.level
返回玩家等级的整数值。要获得 exp
,您“必须”使用 player.level.exp
。我引用了“必须”,因为即使听起来很奇怪,exp
也是关卡的一个属性。它基本上与数字的小数点相同,有意义吗?
此外,调用类似 player.level.increase()
的方法现在更有意义了。虽然,它已经是一个整数值,但为什么不直接执行 player.level += 1
呢?如果您需要在添加中添加一些高级内容,您可以重写 Level.__add__(self, value)
方法。我想不出你为什么不需要这个的单一原因? (不是现在您已经将 required_exp
设为属性)
关于python - 玩家应该继承还是拥有关卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16490290/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!