簡體   English   中英

在通用派生類中隱藏基類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM