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

Ş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>.我怎样才能实现这个或类似的东西?任何克服这一点的设计建议也会很好.

Jon*_*eet 6

但如果他创建了一个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不应该是可见的(例如使其受到保护).