隐藏通用派生类中的基类方法
我有这样一个基类:
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
类以从Foo
inheritance:
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级名称)