隐藏通用派生类中的基类方法

我有这样一个基类:

class FooBase { public bool Do(int p) { /* Return stuff. */ } } 

像这样的儿童class:

 class Foo : FooBase { private Dictionary Dictionary; public bool Do(T p) { int param; if (!Dictionary.TryGetValue(p, out param)) return false; return base.Do(param); } } 

如果用户创建一个名为“fooString”的Foo对象,那么他可以调用fooString.Do(5)fooString.Do("test")但是如果他创建了一个名为“fooInt”的Foo对象,他只能调用派生类的Do方法。 不管T是什么,我更喜欢第二种。

这两个类中的Do方法基本上都做同样的事情。 派生类中的一个使用给定参数从Dictionary获取一个整数,并使用它调用基类的Do方法。

这就是我想在Foo隐藏FooBase的Do方法的FooBase 。 我怎样才能实现这个或类似的东西? 任何克服这一点的设计建议也会很好。

但如果他创建一个名为“fooInt”的Foo对象,他只能调用派生类的Do方法。

不,那不是真的。 如果声明的变量类型是FooBase ,它仍然会调用FooBase方法。 你并没有真正阻止访问FooBase.Do – 你只是隐藏它。

 FooBase foo = new Foo(); foo.Do(5); // This will still call FooBase.Do 

完整示例代码显示:

 using System; class FooBase { public bool Do(int p) { return false; } } class Foo : FooBase { public bool Do(T p) { return true; } } class Test { static void Main() { FooBase foo1 = new Foo(); Console.WriteLine(foo1.Do(10)); // False Foo foo2 = new Foo(); Console.WriteLine(foo2.Do(10)); // True } } 

这就是我想在Foo中隐藏FooBase的Do方法的原因。

你需要考虑Liskov的可替代性原则 。

Foo不应该派生自FooBase (使用组合而不是inheritance) FooBase.Do不应该是可见的(例如,使其受保护)。

您可以使用protected Do方法构建一个抽象的基类,并重写当前的FooBase类以从Fooinheritance:

 public abstract class FooBaseAbstract { protected bool Do(int p) { return true; } } // You can use this one just as your current FooBase class public class FooBase : Foo { } public class Foo : FooBaseAbstract { public bool Do(T p) { if (true /* some test here */) { return base.Do(4); } return false; } } 

(当然改变了class级名称)