标签: composition

"是一个"vs"有一个":哪一个更好?

投资组合A→基金1

投资组合A→基金2

投资组合A→基金3

如果不使用is/has,我无法构建句子.但在1和2之间,

1)有一个:

class PortfolioA
{
    List<Fund> obj;
}
Run Code Online (Sandbox Code Playgroud)

2)是:

class PortfolioA : List<Fund>
{

}
Run Code Online (Sandbox Code Playgroud)

从可扩展性,可用性的角度来看,您认为哪一个更好?我仍然可以通过任何方式访问我的资金,尽管有一个小的语法变化.

oop inheritance composition

8
推荐指数
3
解决办法
8865
查看次数

作文,你怎么知道何时停止?

有一个古老而明智的说法是"价值构成优于继承".我一直在努力将这个以及其他OOP和设计模式应用到我参与的最后几个项目中.

对于大多数情况,它工作得很好,看起来很正确.但是我注意到有些时候,只有2或3个类真正发挥出最佳效果,而其他10个类突然变成了一些简单的委托者,并且细节变化很小.

有时,我尝试通过使用具有不变细节的抽象类来解决这个问题,这些细节将不同的细节委托给具体的实现,但有些事情并不完全正确.

你如何保持这种平衡并同时遵循旧的明智的说法?难道我做错了什么?

oop design-patterns composition

8
推荐指数
1
解决办法
212
查看次数

MEF组成问题

我无法解决看似基本的MEF问题:我有2个"插件"项目(我们称之为P1和P2),以及两个插件共用的第三个项目(我们称之为C) .P1和P2都参考C.

尝试导入位于P1中的组件时,它会失败,因为此组件依赖于C中的组件.

这是跟踪:

System.ComponentModel.Composition警告:1:ComposablePartDefinition 'MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel' 已被拒绝.构图保持不变.由于以下错误,更改被拒绝:组合产生多个组合错误,有4个根本原因.根本原因如下.查看CompositionException.Errors属性以获取更多详细信息.

1)没有出口找到匹配约束 "((exportDefinition.ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel")&&(exportDefinition.Metadata.ContainsKey( "ExportTypeIdentity")&& "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel" .Equals(exportDefinition.Metadata.get_Item( "ExportTypeIdentity"))))".

导致:无法设置进口"MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel(ContractName ='MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel’)"关于部分"MyCompany的.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel".元件:MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel(ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel") - > MyCompany.Client.Pms.Plugin .InclusionList.ViewModel.InclusionListViewModel - > DirectoryCatalog(PATH = "C:\工作\ mmtrader \仪表板\代码\ SRC \仪表板\ MM \操盘\ BIN \调试\插件\位置")

[...](其他3个问题在不同的视图模型上完全相同)

我查看了MEF目录,结果发现MEF知道那些视图模型,所以我不知道缺少什么.

根据Dennis的要求,以下是我的导入/导出:

出口:

Export(typeof(ICalypsoBookSelectorViewModel))]
public class CalypsoBookSelectorViewModel : ScreenWithCleanupLifecycle, ICalypsoBookSelectorViewModel
{...}
Run Code Online (Sandbox Code Playgroud)

进口:

[Import(typeof(ICalypsoBookSelectorViewModel))]
public ICalypsoBookSelectorViewModel CalypsoBookSelectorViewModel { get; set; }
Run Code Online (Sandbox Code Playgroud)

目录:

目录

在此先感谢您的帮助!

c# mef composition

8
推荐指数
2
解决办法
1万
查看次数

找到.NET库的正确组合根

我在这里看到了关于这个论点的各种其他问题,最值得注意的是

依赖注入(DI)"友好"库

Ioc/DI - 为什么我必须在输入应用程序中引用所有层/组件?

和这篇文章(和其他各种材料).

但是,我不清楚将组合根放在库(DLL).NET项目中的哪个位置.该项目不属于本文中提到的任何特定类型.在桌面,控制台甚至Web应用程序中,这一点都是明确定义的.

我目前的方法是包装容器,寄存器类型并重新公开Resolve方法:

class DefaultBootstrapper : IBootstrapper {
  public Bootstrapper() {
    _container = new XXXContainer();
    RegisterTypes(_container);
  }

  public T Resolve<T>() where T : class {
    return _container.Resolve<T>();
  }

  // + other _container.Resolve() overloads

  private readonly XXXContainer _container;
}
Run Code Online (Sandbox Code Playgroud)

然后我阻止库消费者创建库的根实例(例如,定义内部构造函数),从而强制使用单例工厂:

class XYZFactory {
  static XYZFactory() {}

  private XYZFactory(IBootstrapper bootstrapper) {
    _bootstrapper = bootstrapper;
  }

  public static XYZFactory Instance {
    get { return Singleton; }
  }

  public ABCType CreateABCType(string param1) {
    return _bootstrapper.Resolve<ABCType>(param1, …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection inversion-of-control composition

8
推荐指数
1
解决办法
2664
查看次数

可以通过组合完全替换继承吗?

这个问题不是 "遗产与构成"之类的问题.

我完全理解继承与组合有什么不同,我知道Liskov替换原理,钻石问题,它们的优点和缺点以及这两个概念似乎都很简单.但到处都有关于继承和构成的问题,我想,也许我误解了这个简单的想法.

让我们关注Go.Go是一种来自谷歌的语言,每个人都很兴奋它没有继承,它没有类,但它有组成,这很酷.对我来说,Go中的组合为您提供与其他语言(C++,Java,...)中的继承完全相同的功能 - 组件方法会自动公开并作为后续结构的方法提供,如下所示:

package main

import (
    "fmt"
)

type Car struct{
    name string
}

func (c *Car) move() bool { 
    return true
} 

type MyCar struct{
    Car   
}

func main() {
    var c MyCar
    fmt.Print(c.move())
}
Run Code Online (Sandbox Code Playgroud)

所以总结一下,组合比继承更好,因为:

  1. 更灵活(允许您在运行时更改组件,因此您可以影响"类"的工作方式.
  2. 没有钻石问题(但钻石问题是可以解决的,所以这不是强大的优势)

如果您考虑Go及其接口(每个对象,具有接口定义的方法,实现此接口隐含),您是否拥有最终解决方案?我们可以说含有一些语法糖的成分可以代替遗传吗?

这种设计符合Liskov替代原则.我是否会遗漏某些内容或继承(从任何语言中获知)与Go中已知的组合(和接口)相比没有优势?

===== edit1 =====

为了澄清,可以Go使用"标准"组合机制,就像这样(这个例子的行为与前一个一样):

package main

import (
    "fmt"
)

type Car struct{
    name string
}

func (c *Car) move() bool { 
    return true …
Run Code Online (Sandbox Code Playgroud)

language-agnostic oop inheritance design-patterns composition

8
推荐指数
1
解决办法
1151
查看次数

了解Clojure中以数据为中心的应用程序和对象组合

我最近对Chris Granger和他的Light Table的工作留下了深刻的印象.这个问题不是关于光桌,而是关于他在博客文章"作为一种价值的IDE"中描述的"BOT"架构的更多信息:http: //www.chris-granger.com/2013/01/24/所述-IDE作为数据/

现在,我对clojure很新,但想更好地探索这种编程方式:行为,对象,标记:

(behavior* :read-only
                    :triggers #{:init}
                    :reaction (fn [this]
                           (set-options this {:readOnly "nocursor"})))

(object* :notifier
         :triggers [:notifo.click :notifo.timeout]
         :behaviors [:remove-on-timeout :on-click-rem!]
         :init (fn [this]
                 [:ul#notifos
                   (map-bound (partial notifo this) notifos)]))

(object/tag-behaviors :editor.markdown [:eval-on-change :set-wrap])
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到使用该样式的clojure代码和那些组合原则?

clojure composition

8
推荐指数
1
解决办法
716
查看次数

Mixins and duplicate methods in React.js

Getting more and more into the awesomeness that is React.js and I've started to use Mixins more.

One thing I noticed, is that both my mixin and my component can have a componentDidMount method — And both functions will be called, so defining it in the component won't override the one in the mixin and vice versa.

Here's an example:

var MyMixin = {
    componentDidMount: function() {
        // Do something when component is mounted
        console.log("Mixin fn ran");
    }   
};

var …
Run Code Online (Sandbox Code Playgroud)

javascript composition reactjs

8
推荐指数
1
解决办法
2377
查看次数

MEF如何管理实例化外部组件的内部类的导出部件?

我的问题很简单,但遗憾的是我找不到任何答案.

使用MEF,我可以在类库程序集中指定一些内部导出和导入,如下所示:

[Export]
internal class SomeExport
{ }

[ModuleExport(typeof(SomeModule))]
internal class SomeModule : IModule
{ 
    [ImportingConstructor]
    internal SomeModule(SomeExport instance)
    { }
}
Run Code Online (Sandbox Code Playgroud)

我的CompositionContainer位于主EXE程序集中,但不知何故它设法SomeExport在类库程序集中实例化对象,以便我可以使用它.通常,我的内部类库类型不应该从EXE程序集中访问,但不知何故我创建了我的实例.

它是如何工作的?

.net c# mef composition .net-assembly

8
推荐指数
1
解决办法
912
查看次数

子接口如何重用其父项的实现?

最近我接受了一次采访,我被问到以下问题.给定以下类/接口结构:

在此输入图像描述

题:

如何实现接口EmployedStudent来重用代码StudentImplEmployeeImpl.

我建议将员工和学生组成我的实施.

根据采访者的反应,我不认为他们认为这是最好的解决方案.我花了很多时间思考它,但我无法想出另一个解决方案.

java inheritance implementation interface composition

8
推荐指数
2
解决办法
169
查看次数

DTO应该使用继承还是组合

在SOA中,如果一些DTO类具有一些重复的字段.使用Composition或Inheritance是否更好,所以没有重复或只使用一个封装所有字段的DTO类.随着我的DTO类的增长,我看到很多重复的字段名称和Sonar报告是哭泣的家禽.什么是最好的方法(或替代方案).

例如

public class DocDto{
private Long id;
private String name;
private String docType
}

public class DocReviewDto{
private Long id;
private String name;
private String status;
private String comment;
}
Run Code Online (Sandbox Code Playgroud)

java soa design-patterns composition dto

8
推荐指数
1
解决办法
3540
查看次数