- 主题:[求助]inheritance vs composition
最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
目前的composition是通过IOC注册,通过构造器注入field的形式实现的, 传入的时候都已经初始化好了,只能手动调用一次初始化命令来进行属性的初始化工作. 但是感觉这样设计容易造成忘记初始化或者重复初始化的问题.
不知道我表述清楚了没有...
--
FROM 60.180.38.*
猜测,感觉你需要的是java spring中的@PostConstruct提供的功能,让一个函数在完成
一定的初始化功能
【 在 ustcBoy (ustcBoy) 的大作中提到: 】
: 最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
: 在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
: 如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
: ...................
--
FROM 111.206.87.*
感谢! PostConstruct这个词语很好, 让我找到方向了
【 在 hothail 的大作中提到: 】
: 猜测,感觉你需要的是java spring中的@PostConstruct提供的功能,让一个函数在完成
: 一定的初始化功能
:
: ...................
--
FROM 60.180.32.*
不要听人瞎掰。inheritance 和composition各有各的用。
【 在 ustcBoy 的大作中提到: 】
: 最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
: 在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
: 如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
: ...................
--
FROM 183.95.135.*
只是说prefer,并不是一股脑替换。composition带来的扁平化设计模式在需求更改时有时候会比严重依赖inheritance实现时的那种牵一发动全身的感觉好。
【 在 a0123456789q (a0123456789q) 的大作中提到: 】
: 不要听人瞎掰。inheritance 和composition各有各的用。
:
:
: 【 在 ustcBoy 的大作中提到: 】
--
FROM 112.12.139.*
也不是prefer。事实上,继承比组合更基础,因此更应该被prefer。
继承至少有两个好处:
1)概念上清晰,表现子类父类的关系
2)代码上省事,父类的成员都不用重写,而组合需要自己去写。
当然有的场合用组合合适。但perefer哪个分场合。
【 在 ustcBoy 的大作中提到: 】
: 只是说prefer,并不是一股脑替换。composition带来的扁平化设计模式在需求更改时有时候会比严重依赖inheritance实现时的那种牵一发动全身的感觉好。
--
FROM 183.95.135.*
嗯 看情况吧。
回到原来的问题,大佬知道有什么设计办法可以让参与组合的filed进行强制性的初始化工作的方法吗? 我只想到了让它变成实现同样接口的不同类来区分初始化的方法。或者在ctor初始化依赖注入的时候调用接口方法来传递它的初始值。但是我担心设计这种接口方法容易被误用。
【 在 a0123456789q (a0123456789q) 的大作中提到: 】
: 也不是prefer。事实上,继承比组合更基础,因此更应该被prefer。
:
: 继承至少有两个好处:
: 1)概念上清晰,表现子类父类的关系
--
FROM 112.17.237.*
用has a,怎么初始化自己随便搞
另外可以关注一下Required Properties
https://rubikscode.net/2021/07/05/c-10-top-5-new-features-in-the-upcoming-c-version/
【 在 ustcBoy 的大作中提到: 】
: 最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
: 在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
: 如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
: ...................
--
FROM 123.116.197.*
还没体验过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.*
【 在 ustcBoy 的大作中提到: 】
: 最近学习到有种设计思想叫"prefer composition over inheritance", 于是就把自己的一个测试项目进行了改造. 遇到一个问题想请教一下版友们,
: 在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化.
: 如果使用composition模式的话, 应该怎么设计让调用的类来[强制]执行被调类的特定属性初始化呢?
: ...................
"在inheritance结构下,可以通过构造器调用abstract method来强制子类实现特定属性的初始化."
C#是可以这么玩,万一哪天你换个编程语言(比如C++)那绝对是掉坑里了。
--
FROM 222.126.171.*