2010-11-03 145 views
0

我有一个函数,2个派生类使用,但第三个没有,将它留在基类中是有意义的,即使其中一个派生类不使用它?派生类共享方法

我能想到的禁止第三类的唯一方法是基本上创建一个派生于基类的中间类,然后使用常用函数的2派生出第二类。

是否有可能阻止第三类使用函数,同时让两个应该使用它的函数使用它?

这是否似乎太过分了,我的意思是只要我不“尝试”从第三类调用函数,它不应该是一个问题,我只是有兴趣,如果有一种方式以防止它们一起没有很多麻烦。

回答

3

有没有办法直接做到这一点。基本上,当你继承子类时,你说的是子类是基类的一个更具体的版本。

在这种情况下,您试图说“子类是基类的更具体的版本,except for the fact that it shouldn't be able to touch XXX”。实际上,这违反了Liskov Substitution Principle

处理此问题的最佳方法是在您的层次结构中添加第二个基类,这是我相信您提到的解决方案。

基本上,让你的层次:

base 
| \---- subclass without feature available 
| 
\--base+feature 
     \--subclass one with specific feature 
     \--subclass two with specific feature 
+0

是的,这就是我的想象,我只是希望它不会有这个,我只是认为我用于每个派生类的命名现在工作,而我不是确定一个适当的“中级”类名似乎是相当正确的......也不确定是否会导致大量的开销...... – onaclov2000 2010-11-03 16:23:27

+0

@ onaclov2000:它应该不会引入任何开销。我强烈建议尝试使用惯例来强制执行此操作(即:命名),因为您可能会遇到问题。它的惊人之处在于,忘记约定是多么容易。 – 2010-11-03 16:25:13

0

您可以将此功能的虚拟。然后覆盖第三类中的函数并引发异常。它会阻止开发人员在第三类中使用该函数。

+0

虽然这在技术上有效,但这不是一个好主意。这违反了Liskov替代原则。当你使用第三个类作为基类时(它应该总是有效的),它会有意想不到的行为。 – 2010-11-03 16:20:47

+0

问题是我不想在2个类中重复使用相同的函数,但这不会改变这一点。我希望能将这个功能集中到一个“地点”,那么任何未来的修改(如果需要的话)都只能在一个地方,而不是2 – onaclov2000 2010-11-03 16:25:06

+0

@Reed。我同意你的看法,这不是一个干净的解决方案。我将SOLID校长视为非常好的建议,应该如何实施。但是,如果我需要,我不介意打破它们。在构建架构中,您有构建代码,但如果您查看杰作,偶尔会破坏这些代码。你必须知道原则,但如果你知道自己在做什么,可以打破原则。 – Vadim 2010-11-03 16:25:37