Şaf*_*Gür 4 c# inheritance method-hiding
我有这样一个基类:
class FooBase
{
public bool Do(int p) { /* Return stuff. */ }
}
Run Code Online (Sandbox Code Playgroud)
像这样的儿童班:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户创建了一个Foo<string>名为"fooString" 的对象,那么他可以调用两者fooString.Do(5),fooString.Do("test")但如果他创建了一个Foo<int>名为"fooInt" 的对象,他只能调用派生类的Do方法.不管是什么,我更喜欢第二种T.
这两个类中的Do方法基本上都做同样的事情.派生类中的一个从Dictionary<T, int>使用给定参数的a获取一个整数,并使用它调用基类的Do方法.
这就是为什么我想要隐藏FooBasein 的Do方法Foo<T>.我怎样才能实现这个或类似的东西?任何克服这一点的设计建议也会很好.
但如果他创建了一个
Foo<int>名为"fooInt" 的对象,他只能调用派生类的Do方法.
不,那不是真的.如果声明的变量类型是FooBase,它仍将调用该FooBase方法.你并没有真正阻止访问FooBase.Do- 你只是隐藏它.
FooBase foo = new Foo<int>();
foo.Do(5); // This will still call FooBase.Do
Run Code Online (Sandbox Code Playgroud)
完整示例代码显示:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想在Foo中隐藏FooBase的Do方法的原因.
你需要考虑Liskov的可替代性原则.
两者 Foo<T>都不应该派生FooBase(使用组合而不是继承)或者 FooBase.Do不应该是可见的(例如使其受到保护).
| 归档时间: |
|
| 查看次数: |
1455 次 |
| 最近记录: |