如何用面向对象表示层次结构情况?



当我有一个人类的一般例子,然后是一个家庭成员的类时,我试图让我的头围绕OOP思考家庭成员共用一个地址,但并非所有人都有相同的地址。

你是如何做到的,这样你就可以创建家庭,其中成员共享相同的地址,而不必输入相同的地址,每个人,但不同的家庭有不同的地址?

我看到过这样的例子,你定义了从主类person继承的子类,但你必须将每个类硬编码为一个类。关于如何在面向对象中实现这一点,有什么看法吗?我可能用错误的方式看待这个问题……

在定义类之间的关系之前,首先要检查它们是否遵循IS-AHas-A关系中的任何一个。

在上面的问题中,肯定有两个实体。一个是Person,另一个是Family

现在我们可以画出它们之间的关系如下:

  1. Person Is-A family =>这听起来不对。一个家庭应该不止一个人。

  2. Person Has-A family =>这听起来很对。但是一个人可以有多个家庭。考虑到丈夫可以拥有自己的家人和岳父母的大家庭。

  3. person Has-A家属名单。=比;这听起来很好。

  4. Family Is-A person =>这听起来不对。

  5. Family Has-A person =>这听起来是对的,但是一个家庭可以有不止一个人。

  6. 家庭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 AnimalCow 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类获取数据。

相关内容

  • 没有找到相关文章

最新更新