编程语言
首页 > 编程语言> > c# – 隐藏通用派生类中的基类方法

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

作者:互联网

我有这样一个基类:

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方法.

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

解决方法:

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,inheritance,method-hiding
来源: https://codeday.me/bug/20190530/1182217.html