Class n细节,它们对于实现任何风格的组合都不是至关重要的 OP在评论中说:
但在概念上,为了将其作为一个组合正确地实现, 我更喜欢类似分部类(如C#)的东西,这样我就可以 将代码分为多个文件,但限制其可实例化性 只适用于主课。我知道你不同意我的意见,我不得不这么做 以某种方式表达我的观点 这是一个错误的例子,因为分部类只是一个语法糖,用于粘合定义同一个类的多个文件,以后所有内容都是同一个类 C#具有嵌套类: 但是您需要理解类型定义从概念的角度与对象无关,因为面向对象的语言可能有也可能没有类型系统和类,但它可以支持组合及其所有风格。这些概念(如组合)是通用的,它们的实现可能因编程语言而异 另一方面,我不会说组合的定义,包括[…]没有独立的存在,指的是能够从不同的范围创建实例或不创建实例 没有一个独立的存在比实际规则更具概念性。这意味着车轮永远不可能是合成根,因为根就是汽车。也就是说,车轮不能独立于汽车而存在 因此,结论是嵌套类只是一个实现细节,它们与组合无关。请注意,并非所有编程语言中的类都可以创建对象,但组合和许多其他功能仍然是可能的。你会说对象组合在JavaScript中是不可能的吗Class n细节,它们对于实现任何风格的组合都不是至关重要的 OP在评论中说:,class,oop,inner-classes,encapsulation,composite,Class,Oop,Inner Classes,Encapsulation,Composite,但在概念上,为了将其作为一个组合正确地实现, 我更喜欢类似分部类(如C#)的东西,这样我就可以 将代码分为多个文件,但限制其可实例化性 只适用于主课。我知道你不同意我的意见,我不得不这么做 以某种方式表达我的观点 这是一个错误的例子,因为分部类只是一个语法糖,用于粘合定义同一个类的多个文件,以后所有内容都是同一个类 C#具有嵌套类: 但是您需要理解类型定义从概念的角度与对象无关,因为面向对象的语言可能有也可能没有类型系统和类,但它可以支持组合及其所有风格。这些概念(如组合)是通用的,它们的实现可
var car = { manufacturer: "Ford", model: "Focus" };
// I can create the wheel after the car
var wheel = { color: "black" };
// but it'll be always tied to some car
car.wheel = wheel;
无论如何,几乎所有系统都实现聚合,这是一种组合风格。看看软件工程
虽然车轮不属于汽车的一部分是无用的,但车轮仍然作为汽车制造的许多机械部件之一单独出售,因此车轮可以单独生活,但它作为一个部件是无用的
面向对象编程中组合的一般定义
OP过于关注并专注于UML中组合的形式化定义:组合、关联、直接关联、聚合
顺便说一句,OOP中的复合一词有一个更简单的含义,这是经常使用的,例如,在讨论何时使用继承或何时避免继承时,我们讨论的是。例如,请看2010年的问答:基本上所有回答者都对作文的定义有共识
最终,术语组合是创建对象图的方法:将简单类型关联在一起以创建更复杂的类型
因此,正如我在本答案的第一部分中所解释的,嵌套类只是编程语言实现的一个细节,它们对于实现任何形式的组合都不是至关重要的
OP在评论中说:
但在概念上,为了将其作为一个组合正确地实现,
我更喜欢类似分部类(如C#)的东西,这样我就可以
将代码分为多个文件,但限制其可实例化性
只适用于主课。我知道你不同意我的意见,我不得不这么做
以某种方式表达我的观点
这是一个错误的例子,因为分部类只是一个语法糖,用于粘合定义同一个类的多个文件,以后所有内容都是同一个类
C#具有嵌套类:
但您需要理解,类型定义从概念的角度与对象无关,因为面向对象语言可能有也可能没有类型系统和类,但它可以支持组合及其所有风格。在wikipedia中,下面还有一个不使用私有嵌套类的组合示例
class University
{
std::vector<Department> faculty; //this is composition
std::vector<People*> people; //this is aggregation
University() // constructor
{
// Composition: Departments exist as long as the University exists
faculty.push_back(Department("chemistry"));
faculty.push_back(Department("physics"));
faculty.push_back(Department("arts"));
}
};
但是,当人们把“汽车”的“轮子”当作零件(而不是“访客”)时,即使是可转移性也常常被忽视
而不是“神经网络”和“神经元”或“森林”和“树”。树木不会经常被移植到不同的森林
而且,由于轮子仍然可以理解为复合的一部分,因此它不必与代码中的聚合有所不同。在wikipedia中,还有以下不使用私有嵌套类的复合示例
class University
{
std::vector<Department> faculty; //this is composition
std::vector<People*> people; //this is aggregation
University() // constructor
{
// Composition: Departments exist as long as the University exists
faculty.push_back(Department("chemistry"));
faculty.push_back(Department("physics"));
faculty.push_back(Department("arts"));
}
};
但是,当人们把“汽车”的“轮子”当作零件(而不是“访客”)时,即使是可转移性也常常被忽视
而不是“神经网络”和“神经元”或“森林”和“树”。树木不会经常被移植到不同的森林
而且,由于轮子仍然可以理解为组合的一部分,因此它不必与代码中的聚合有所不同。我假设基本上只有一种方法可以通过使用私有嵌套类来实现这一点。那是不对的。阅读:。它被称为对象组合是有原因的。为什么我们需要嵌套类?没有他们我们活得很好这是有组织的。有些语言支持使用嵌套类进行额外的封装,但这只是实现细节。它没有定义“适当”或“不适当”的OOPL。我假设基本上只有一种方法可以通过使用私有嵌套类来实现这一点。那是不对的。阅读:。它被称为对象组合是有原因的。为什么我们需要嵌套类?没有他们我们活得很好这是有组织的。有些语言支持使用嵌套类进行额外的封装,但这只是实现细节。它没有定义“适当”或“不适当”的OOPL。在我看来,汽车和车轮的示例是聚合,合成将是一些透明材质类别和折射率之类的属性。许多真实世界中的“组件”示例可以在较大组件被破坏后继续存在(被赋予了汽车、森林、网络等抽象概念)你能摧毁多少部分,直到你无法摧毁
/*this is a component's "class"*/
function Text(txt){
this.txt = txt;
}
/*this is a composite's "class"*/
function Hello(begining){
/*public object*/
this.begining = begining;
/*this is like making an instance from a nested function which is a composite*/
var Middle = new (function Middle(txt){
this.txt = txt;
})(" - ");
/*private object - also a composite, even though it's made of the public class Text*/
var Ending = new Text("that's all.");
/*The use of the private property Ending*/
this.Say = function(){
var msg = this.begining.txt + Middle.txt + Ending.txt;
console.log(msg);
}
}
/*
This txt variable will be the "begining" text. It could still be a composite, but
only if it's not used in another composite when purpose is to be
"an untransferable part" and not a "visitor".
*/
var txt = new Text("Dan");
var say1 = new Hello(txt);
var say2 = new Hello(new Text("To be or not to be"));
say1.Say() /*Dan - that's all.*/
say2.Say() /*To be or not to be - that's all.*/