相关疑难解决方法(0)

喜欢构成而不是继承?

为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?

language-agnostic oop inheritance composition aggregation

1538
推荐指数
23
解决办法
29万
查看次数

面向对象的最佳实践 - 继承v组合v接口

我想问一个关于如何处理简单的面向对象设计问题的问题.我对自己处理这种情况的最佳方法有一些想法,但我有兴趣听听Stack Overflow社区的一些意见.还赞赏相关在线文章的链接.我正在使用C#,但问题不是语言特定的.

假设我写一个视频商店应用程序,其数据库中有一个Person表,其中PersonId,Name,DateOfBirthAddress领域.它还有一个Staff表,其中包含指向a的链接PersonId,以及一个Customer也链接到的表PersonId.

一个简单的面向对象的方法是说Customer"是一个" Person,因此创建类有点像这样:

class Person {
    public int PersonId { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string Address { get; set; }
}

class Customer : Person {
    public int CustomerId { get; set; }
    public DateTime JoinedDate { get; set; }
}

class Staff …
Run Code Online (Sandbox Code Playgroud)

oop inheritance composition

39
推荐指数
5
解决办法
2万
查看次数

我应该使用继承还是组合?

我想简短一点.我建有两间HouseA,说BedRoomStudyRoom,从所谓的基类派生两者Room. BedRoom并且StudyRoom有一个同一个父母叫House.此外,房屋内的任何房间只能通过父母进入任何其他房间.如果BedRoom必须访问任何属性StudyRoom,它必须只通过House(即父),反之亦然.

HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Run Code Online (Sandbox Code Playgroud)

现在的问题:让我们说,我建造另一个家(比方说HouseB),这与上面完全相同,但只有一个改变.我不想要两个单独的房间(即BedRoomStudyRoom),而是一个房间(MasterRoom),这两个房间都有这些设施.为了代码可重用性,我可以想到以下设计选项:

Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Run Code Online (Sandbox Code Playgroud)

在这里,我失去了再利用的属性的能力BedRoomStudyRoom我的创造HouseA.请注意,大多数的属性BedRoom,并StudyRoom需要重新实现MasterRoom无论如何,从而导致代码重复.

Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS …
Run Code Online (Sandbox Code Playgroud)

oop perl inheritance composition

15
推荐指数
1
解决办法
1498
查看次数