- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个这样的基类:
class FooBase
{
public bool Do(int p) { /* Return stuff. */ }
}
像这样的子类:
class Foo<T> : FooBase
{
private Dictionary<T, int> Dictionary;
public bool Do(T p)
{
int param;
if (!Dictionary.TryGetValue(p, out param))
return false;
return base.Do(param);
}
}
如果用户创建一个 Foo<string>
对象称为“fooString”,那么他可以同时调用 fooString.Do(5)
和 fooString.Do("test")
但如果他创建一个 Foo<int>
一个名为“fooInt”的对象,他只能调用派生类的Do方法。不管 T
是什么,我都喜欢第二个是。
这两个类中的 Do 方法基本上做同样的事情。派生类中的一个从 Dictionary<T, int>
中获取一个整数使用给定的参数并使用它调用基类的 Do 方法。
这就是为什么我想隐藏 FooBase
的 Do 方法的原因在Foo<T>
.我怎样才能做到这一点或类似的东西?任何克服这个问题的设计建议也很好。
最佳答案
but if he creates a
Foo<int>
object called "fooInt", he can only call the Do method of the derived class.
不,那不是真的。如果变量的声明类型是FooBase
, 它仍然会调用 FooBase
方法。您并没有真正阻止访问 FooBase.Do
- 你只是把它藏起来了。
FooBase foo = new Foo<int>();
foo.Do(5); // This will still call FooBase.Do
完整的示例代码表明:
using System;
class FooBase
{
public bool Do(int p) { return false; }
}
class Foo<T> : FooBase
{
public bool Do(T p) { return true; }
}
class Test
{
static void Main()
{
FooBase foo1 = new Foo<int>();
Console.WriteLine(foo1.Do(10)); // False
Foo<int> foo2 = new Foo<int>();
Console.WriteLine(foo2.Do(10)); // True
}
}
That's why I want to hide the Do method of the FooBase in Foo.
你需要考虑Liskov's Substitutability Principle .
要么 Foo<T>
不应派生自 FooBase
(使用组合而不是继承)或 FooBase.Do
不应该是可见的(例如,使其受到保护)。
关于c# - 在泛型派生类中隐藏基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758411/
我是一名优秀的程序员,十分优秀!