gpt4 book ai didi

c# - 在泛型派生类中隐藏基类方法

转载 作者:太空狗 更新时间:2023-10-30 00:54:47 24 4
gpt4 key购买 nike

我有一个这样的基类:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com