【发布时间】:2022-01-26 16:58:56
【问题描述】:
如上所示,我有一个 System 类型,它有 3 个子类。这些系统中的每一个都可以有不同类型的身份验证方法,并且一个 System 实例将有一个 Authenticator 实例。这个想法是某些系统可以有自己的身份验证“策略”,也可能使用通用策略。但是,应该只允许每个系统使用系统特定的或某些“允许的”Authenticators。
所以图中SystemA可以使用SystemA Quick Authenticator、System A Reuse Authenticator和Generic Authenticator 2 . 系统 A 不应被允许使用,例如。 Generic Authenticator 1 或任何System B Authenticator。同样,System B 也有类似的设置,而 System C 只允许使用 Generic Authenticator 2。这种工作正常,但一旦我需要在 Base System A Authenticator 中实现一些基本逻辑就会失败,而 Generic Authenticator 2 也需要实现。 p>
我想使用某种组合而不是继承,并且有一个 System A Auth Handler,它只是链接到一个 BaseAuthenticator 并使用一些域逻辑来控制例如。 Generic Authenticator 1 从未使用过。然而,这似乎也不是一个很好的解决方案。
您是否知道如何实现这种子类“限制”设置,而无需进行手动类型检查且不影响 OO 原则(例如,接口隔离原则在当前设置中似乎已被严重破坏。 .)?
【问题讨论】:
-
在我看来,显而易见的解决方案是向
Generic Authenticator 2和Base System A Authenticator添加一个共同的祖先抽象类,而不是让它们都直接从Base Authenricator继承。 -
嗨 Zohar,是的,你的意思是,如果应该有任何 System A 特定细节,他们应该进入当前称为 Base System A Authenticator 的类?因为如果在 Generic 2 中需要它们,那么它实际上根本就不是通用的。
-
是的,差不多
-
我实际上采用了稍微不同的解决方案。我创建了一个继承自当前 System A Base Auth 的 System A Generic 2 Wrapper 类。这样,通用类不依赖于 System A 层次结构中的类(或接口),即使该方法通常可能会产生更多类。非常感谢 Zohar 的帮助,非常感谢,您的建议对我很有帮助。
标签: c# inheritance dependencies composition object-oriented-analysis