投资组合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和设计模式应用到我参与的最后几个项目中.
对于大多数情况,它工作得很好,看起来很正确.但是我注意到有些时候,只有2或3个类真正发挥出最佳效果,而其他10个类突然变成了一些简单的委托者,并且细节变化很小.
有时,我尝试通过使用具有不变细节的抽象类来解决这个问题,这些细节将不同的细节委托给具体的实现,但有些事情并不完全正确.
你如何保持这种平衡并同时遵循旧的明智的说法?难道我做错了什么?
我无法解决看似基本的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)
目录:

在此先感谢您的帮助!
我在这里看到了关于这个论点的各种其他问题,最值得注意的是
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) 这个问题不是 "遗产与构成"之类的问题.
我完全理解继承与组合有什么不同,我知道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)
所以总结一下,组合比继承更好,因为:
如果您考虑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
我最近对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代码和那些组合原则?
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.
var MyMixin = {
componentDidMount: function() {
// Do something when component is mounted
console.log("Mixin fn ran");
}
};
var …Run Code Online (Sandbox Code Playgroud) 我的问题很简单,但遗憾的是我找不到任何答案.
使用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程序集中访问,但不知何故我创建了我的实例.
它是如何工作的?
最近我接受了一次采访,我被问到以下问题.给定以下类/接口结构:

题:
如何实现接口EmployedStudent来重用代码StudentImpl和EmployeeImpl.
我建议将员工和学生组成我的实施.
根据采访者的反应,我不认为他们认为这是最好的解决方案.我花了很多时间思考它,但我无法想出另一个解决方案.
在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) composition ×10
c# ×3
inheritance ×3
oop ×3
java ×2
mef ×2
.net ×1
clojure ×1
dto ×1
interface ×1
javascript ×1
reactjs ×1
soa ×1