【发布时间】:2019-02-22 05:34:46
【问题描述】:
我有以下问题:
基类希望接收一些数据,但数据是由派生类构造函数初始化的,在 C# 中,派生类构造函数在调用基构造函数之后调用。
上下文/我要解决的问题:
我们将基类称为Track,它的作用是构建一个表示视频游戏轨道的网格。
派生类,例如Track1 每个从特定文件格式获取轨道数据,有显着差异,禁止在基类 Track 中实现整个代码。
Track 的主要工作是抽象从派生类传入的数据,为此它具有派生类必须实现的抽象成员,例如int GetVertexCount, Vector3 GetVertex(int).
想一想它是一个可以从不同格式加载的IPicture 接口,例如BMP、JPEG,并将整个事物作为抽象返回。
我面临的问题:
在 C# 中,基类构造函数在派生类构造函数之前调用,但是我必须在 派生 类构造函数中初始化一些东西,然后我必须将其传递给 base 类构造函数。在我这样做的同时,我希望成员是不可变的,即readonly。
问题:
如何先在派生类构造函数中运行一些代码,以便将结果传递给基构造函数?
答案:
按照 @Kit 的回答,这就是我最终的做法,这很好:
具有讽刺意味的是,它最终变成了一个类似 C 的 API :)
【问题讨论】:
-
您可以在
Base类中创建abstract或virtual方法并在_s = s.ToLower()之前邀请它,然后在Derived中覆盖该方法。 -
对不起,我不够清楚并更新了我的问题,虽然你的方法确实很有趣,但我无法从该方法初始化
readonly字段。 -
为什么需要处理来自ctor的
_o,只需将处理移到该方法中并作为返回值返回并在Base中使用... -
听起来像XY Problem。你到底想做什么?
-
这些类不应彼此共享层次结构。加载轨道的东西本身并不是轨道。它应该产生一个轨道,而不是被加载的轨道。
标签: c# design-patterns constructor