我正在努力学习课程的运作方式。我想用一些共享元素创建不同的类,而不是其他类,但据我所知,我可以通过三种不同的方式创建它:
创建一个包含所有共享元素的类,然后继承此类并修改新类中的特定方法和属性。这样的事情:
class Enemy(object):
"""Enemy!"""
def __init__(self, damage=30, life=100, enemy="Hero"):
#And keep defining the class and its methods and attributes in common with all the enemys
class Troll(Enemy):
"""Troll!"""
def __init__ (self, defense=0):
#And define the specific attributes and methods for Trolls.
创建一个类并询问一种类,并更改从中获取输入的对象的定义。这样的事情:
class Enemy(object):
"""Enemy!"""
def __init__(self, damage=30, defense=0, life=100, type="Troll" enemy="Hero"):
if type=="Troll":
#Do that for type "Troll"
if type=="Goblin":
#Do that for type "Goblin"
#And keep defining the class and its methods and attributes for each accepted type
创建两个不同的类,然后执行多重继承:
class Enemy(object):
"""Enemy!"""
def __init__(self, damage=30, life=100, enemy="Hero"):
#And keep defining the class and its methods and attributes in common with all the enemys
class Trolls(object):
"""Trolls!"""
def __init__ (self, defense=1, shield=20):
#And define the specific attributes and methods for Trolls.
class SuperTroll(Enemy, Trolls):
我看到第一个是简单的,让我可以更灵活地创建具有共享方法和属性的多个类。但第二个似乎更容易使用(或者至少我喜欢它),我可以随心所欲地摆脱if
条件。并且第三个可以用于混合不同类而没有任何共享方法或属性,并且如果它们共享它不会弄乱它(或者它会?)。
哪一个更好?
但是关于以一种或另一种方式写作,似乎只是关于你如何想要你的代码的策略问题。 这是正确的吗?
答案 0 :(得分:2)
First one:
适当的方式......你继承了集体“ENEMY”。在这里,你可以拥有“ENEMY”在课堂下的共同点,并为所有类型的敌人提供单独的类,而且你也可以覆盖一些使某种“ENEMY”与众不同的方法。
Second one:
不好或适当的面向对象,因为如果“巨魔”有一些不被其他“敌人”共享的属性。您可能会说它可以使用“if”语句,但这会使代码更易于管理,这就是您使用OOP的原因(管理代码,这不仅仅是其中一个原因)。
Third one:
我强烈建议尽量不要使用多重继承。谷歌钻石死亡问题,你会知道为什么。多重继承的一条规则 - “如果你认为你需要多重继承,你可能就错了。如果你知道你必须使用多重继承,那么你可能是对的。”
答案 1 :(得分:2)
第二个例子不是一个好主意;它会导致大量重复的代码,每当你想出一种新的敌人角色时,你都必须编辑你的Enemy
课程。
第一个和第三个之间的选择比较棘手,并且取决于你想要达到的目标(“战略问题”,就像你拥有它一样)。
来自Enemy
和Troll
的{{1}}的第一个单一继承非常有用,因为它允许您定义所有Goblin
字符将具有的所有代码,并且只定义Enemy
和Troll
类中的差异。您可以进一步扩展它,并使Goblin
继承自超类(或元类)Enemy
,它为Character
和Enemy
类提供了真正基本的东西(例如{ {1}},Hero
,...)。
name
如果要分隔字符和角色,第三个示例可能很有用,例如:你可能有
health
和
class Enemy(Character)
class Troll(Enemy)
如果这些角色意味着不同的实例属性(例如class FriendlyTroll(Troll, Friend)
混合可能会引入class UnfriendlyTroll(Troll, Enemy)
方法)。这会让你的角色定义更加复杂,但是如果你不打算使用额外的功能,那么要解决这个问题需要很多复杂的工作,并且可能导致难以解决的多重继承问题。
TL; DR :使用第一个!如果您稍后决定确实需要将角色分离为混合类,那么这不是一项复杂的任务。
答案 2 :(得分:1)
嗯,类本质上描述了这些类的对象的行为的差异。那是你可以选择任何一种方法,但只有在你坐下来决定之后:
在你的程序中一般来说,给定巨魔和敌人之间的区别是什么。如果存在这样的差异(即,有些情况下“巨魔”的行为与一般的敌人有所不同,或者有自己的方法(行动)等),那么你需要区分类Troll和类Enemy。如果他们的名字不同就是他们的名字,那么你可能不需要一个单独的班级......
只有在需要混合两个不相关类的行为时,才需要多重继承(第三种情况)。一般来说,这是一个艰难的方式,有一些陷阱和陷阱。但如果你足够聪明和准确,那么你可能会成功。