- 主题:[求助]inheritance vs composition
最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
目前的composition是通过IOC注册,通过构造器注入field的形式实现的, 传入的时候都已经初始化好了,只能手动调用一次初始化命令来进行属性的初始化工作. 但是感觉这样设计容易造成忘记初始化或者重复初始化的问题.
不知道我表述清楚了没有...
--
FROM 60.180.38.*
感谢! PostConstruct这个词语很好, 让我找到方向了
【 在 hothail 的大作中提到: 】
: 猜测,感觉你需要的是java spring中的@PostConstruct提供的功能,让一个函数在完成
: 一定的初始化功能
:
: ...................
--
FROM 60.180.32.*
只是说prefer,并不是一股脑替换。composition带来的扁平化设计模式在需求更改时有时候会比严重依赖inheritance实现时的那种牵一发动全身的感觉好。
【 在 a0123456789q (a0123456789q) 的大作中提到: 】
: 不要听人瞎掰。inheritance 和composition各有各的用。
:
:
: 【 在 ustcBoy 的大作中提到: 】
--
FROM 112.12.139.*
嗯 看情况吧。
回到原来的问题,大佬知道有什么设计办法可以让参与组合的filed进行强制性的初始化工作的方法吗? 我只想到了让它变成实现同样接口的不同类来区分初始化的方法。或者在ctor初始化依赖注入的时候调用接口方法来传递它的初始值。但是我担心设计这种接口方法容易被误用。
【 在 a0123456789q (a0123456789q) 的大作中提到: 】
: 也不是prefer。事实上,继承比组合更基础,因此更应该被prefer。
:
: 继承至少有两个好处:
: 1)概念上清晰,表现子类父类的关系
--
FROM 112.17.237.*
还没体验过C#10, Required Properties适用于在IOC注册注入的这种方式吗? 它的初始化在被作为ctor参数传入前就应该被完成了吧?
恩,调用一个类似Init的函数初始化它是可以做.我的问题是想知道有什么特定的初始化方式吗?
比如说,前面说的调用Init来初始化的方法, 如果Init被作为一个普通接口多次调用或者在错误地方调用的话,是很难防止的吧?
在使用继承(is a)的时候,我觉得子类去override一个父类的初始化方法会相对安全很多.
【 在 leadu 的大作中提到: 】
: 用has a,怎么初始化自己随便搞
: 另外可以关注一下Required Properties
:
https://rubikscode.net/2021/07/05/c-10-top-5-new-features-in-the-upcoming-c-version/: ...................
--
FROM 112.12.139.*
是的,在C#这个架构体系下,我想用它自带的,或者是出于设计者设计目的的方法,应该还OK吧?
所以才有了开头的疑问,既然有人提出了prefer composition over inheritance的思想,不知道composition这种方式有没有天生的设计办法解决特定属性初始化的差异需求.
【 在 hongdiao 的大作中提到: 】
:
: "在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化."
: C#是可以这么玩,万一哪天你换个编程语言(比如C++)那绝对是掉坑里了。
--
FROM 115.221.139.*
Autofac用的不是很熟练, 是不是可以在注册实现相同Interface的Service时,给定不同的property让它们注册成有区别的Service. 然后在Composition的时候请求不同实现的Service注入?
想法不成熟,语言组织的有点乱,见笑
【 在 ustcBoy 的大作中提到: 】
: 是的,在C#这个架构体系下,我想用它自带的,或者是出于设计者设计目的的方法,应该还OK吧?
: 所以才有了开头的疑问,既然有人提出了prefer composition over inheritance的思想,不知道composition这种方式有没有天生的设计办法解决特定属性初始化的差异需求.
:
--
FROM 115.221.139.*
这是.net板块啊…
【 在 hongdiao (hongdiao) 的大作中提到: 】
:
: 【 在 ustcBoy 的大作中提到: 】
: : 是的,在C#这个架构体系下,我想用它自带的,或者是出于设计者设计目的的方法,应该还OK吧?
: : 所以才有了开头的疑问,既然有人提出了prefer composition over inheritance的思想,不知道composition这种方式有没有天生的设计办法解决特定属性初始化的差异需求.
--
FROM 60.180.32.*
下午看了一下Autofac的文档, 我觉得在注册的时候用Autofac的Keyed Services应该可以搞定了,
在执行组合的类进行ctor注入的时候,传递参数给IIndex,这样就能实现调用相同接口的不同实现了.
--
FROM 115.221.139.*