[英]Hide a base class method in a generic derived class
我有一個這樣的基類:
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);
}
}
如果用戶創建了一個名為“ fooString”的Foo<string>
對象,那么他可以同時調用fooString.Do(5)
和fooString.Do("test")
但是如果他創建了一個名為“ fooInt”的Foo<int>
對象,他只能調用派生類的Do方法。 無論T
是什么,我都喜歡第二個。
這兩個類中的Do方法本質上都是相同的。 派生類中的一個使用給定參數從Dictionary<T, int>
獲取一個整數,並使用該整數調用基類的Do方法。
這就是為什么我要在Foo<T>
隱藏FooBase
的Do方法。 我怎樣才能做到這一點或類似的東西? 任何克服此問題的設計建議也都不錯。
但是,如果他創建一個名為“ fooInt”的
Foo<int>
對象,則他只能調用派生類的Do方法。
不,那不是真的。 如果聲明的變量類型為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
}
}
這就是為什么我要在Foo中隱藏FooBase的Do方法。
您需要考慮Liskov的可替換性原理 。
要么 Foo<T>
不應該從派生FooBase
(使用組合物,而不是繼承) 或 FooBase.Do
不應該是可見的(例如,使之保護)。
您可以使用protected Do
方法構建一個抽象的基類,然后重寫當前的FooBase
類以從Foo<T>
繼承:
public abstract class FooBaseAbstract
{
protected bool Do(int p)
{
return true;
}
}
// You can use this one just as your current FooBase class
public class FooBase : Foo<int>
{
}
public class Foo<T> : FooBaseAbstract
{
public bool Do(T p)
{
if (true /* some test here */)
{
return base.Do(4);
}
return false;
}
}
(當然要更改類名)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.