当我有一个人类的一般例子,然后是一个家庭成员的类时,我试图让我的头围绕OOP思考家庭成员共用一个地址,但并非所有人都有相同的地址。
你是如何做到的,这样你就可以创建家庭,其中成员共享相同的地址,而不必输入相同的地址,每个人,但不同的家庭有不同的地址?
我看到过这样的例子,你定义了从主类person继承的子类,但你必须将每个类硬编码为一个类。关于如何在面向对象中实现这一点,有什么看法吗?我可能用错误的方式看待这个问题……
在定义类之间的关系之前,首先要检查它们是否遵循IS-A
或Has-A
关系中的任何一个。
在上面的问题中,肯定有两个实体。一个是Person
,另一个是Family
现在我们可以画出它们之间的关系如下:
Person
Is-A
family =>这听起来不对。一个家庭应该不止一个人。Person
Has-A
family =>这听起来很对。但是一个人可以有多个家庭。考虑到丈夫可以拥有自己的家人和岳父母的大家庭。person
Has-A
家属名单。=比;这听起来很好。Family
Is-A
person =>这听起来不对。Family
Has-A
person =>这听起来是对的,但是一个家庭可以有不止一个人。家庭
Has-A
人员名单=>这听起来很好。
因此,在上述所有关系中,关系3和关系6是完美的。
在oop中,Has-A
是一种组合关系。而Is-A
关系遵循继承。
所以你的类将有如下定义:
public class Family {
String name;
Family[] families;
}
public class Family{
String name;
Person[] persons;
}
这基本上是一个多对多关系和形式的双向图结构。根据您的用例,您可以将这种关系减少为一对多。
然而,如果你考虑Monkey IS-A Animal
和Cow IS-A Animal
,有了这些关系,我们可以定义父子继承层次。
abstract class Animal {
abstract void makeSound();
}
class Monkey extends Animal{
void makeSound() {}
}
class Cow extends Animal{
void makeSound() {}
}
关于如何定义这种关系,没有一个统一的答案。这完全取决于用例。
一种方法是设置两个类:Family和Person。Family类将有两个主要属性:
- Person的集合(如数组、列表等) <
- 地址/gh>
Person类需要有一个对它所属的Family对象的引用。所以它的属性可能是:
<- 名称/gh>
- 出生日期
- …
- 对Family Object 的引用
一般来说,为了用OOP来表示层次结构,你可以做一些叫做组合的事情,也就是把一些对象作为另一个对象的属性。
我认为这种方法:
class Family(object):
def __init__(self, name, address):
self.members = []
self.name = name
self.address = address
def addMember(self, member):
self.members.append(member)
def getAddress(self):
return self.address
class Person(object):
def __init__(self, name, family, address = None):
self.name = name
self.family = family
self.address = address
self.family.addMember(self)
def getAddress(self):
return self.address if self.address else self.family.getAddress()
if __name__ == "__main__":
family = Family("family 1", "family 1 address")
person1 = Person("person1", family)
person2 = Person("person2", family, address="person 2 address")
print(family.members)
print(person1.getAddress()) # print "family 1 address"
print(person2.getAddress()) # print "person 2 address"
您可以将人员地址设置为None
,如果地址为None
,则从Family
类获取数据。