Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class n细节,它们对于实现任何风格的组合都不是至关重要的 OP在评论中说:_Class_Oop_Inner Classes_Encapsulation_Composite - Fatal编程技术网

Class n细节,它们对于实现任何风格的组合都不是至关重要的 OP在评论中说:

Class n细节,它们对于实现任何风格的组合都不是至关重要的 OP在评论中说:,class,oop,inner-classes,encapsulation,composite,Class,Oop,Inner Classes,Encapsulation,Composite,但在概念上,为了将其作为一个组合正确地实现, 我更喜欢类似分部类(如C#)的东西,这样我就可以 将代码分为多个文件,但限制其可实例化性 只适用于主课。我知道你不同意我的意见,我不得不这么做 以某种方式表达我的观点 这是一个错误的例子,因为分部类只是一个语法糖,用于粘合定义同一个类的多个文件,以后所有内容都是同一个类 C#具有嵌套类: 但是您需要理解类型定义从概念的角度与对象无关,因为面向对象的语言可能有也可能没有类型系统和类,但它可以支持组合及其所有风格。这些概念(如组合)是通用的,它们的实现可

但在概念上,为了将其作为一个组合正确地实现, 我更喜欢类似分部类(如C#)的东西,这样我就可以 将代码分为多个文件,但限制其可实例化性 只适用于主课。我知道你不同意我的意见,我不得不这么做 以某种方式表达我的观点

这是一个错误的例子,因为分部类只是一个语法糖,用于粘合定义同一个类的多个文件,以后所有内容都是同一个类

C#具有嵌套类:

但是您需要理解类型定义从概念的角度与对象无关,因为面向对象的语言可能有也可能没有类型系统和类,但它可以支持组合及其所有风格。

这些概念(如组合)是通用的,它们的实现可能因编程语言而异

另一方面,我不会说组合的定义,包括[…]没有独立的存在,指的是能够从不同的范围创建实例或不创建实例

没有一个独立的存在比实际规则更具概念性。这意味着车轮永远不可能是合成根,因为根就是汽车。也就是说,车轮不能独立于汽车而存在

因此,结论是嵌套类只是一个实现细节,它们与组合无关。请注意,并非所有编程语言中的类都可以创建对象,但组合和许多其他功能仍然是可能的。你会说对象组合在JavaScript中是不可能的吗

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.*/