2010-04-20 163 views
22

我有這樣的代碼在基類重寫繼承泛型方法

protected virtual bool HasAnyStuff<TObject>(TObject obj) where TObject:class 
    { 
     return false; 
    } 

在子類中,我重寫

protected override bool HasAnyStuff<Customer>(Customer obj) 
    { 
    //some stuff 
     if Customer.sth etc 
     return false; 
    } 

我收到此錯誤

「」'類型參數聲明必須是不是類型的標識符'''

這是什麼我在這裏做錯了?

回答

39

您無法在派生類中重寫泛型方法的類型參數。要實現類似的功能,一個選擇是讓你的基類是通用類,並有在那裏BaseClass被聲明爲

class BaseClass<T> where T : class 
{ 
    // ... 
    protected virtual bool HasAnyStuff(T obj) 
    { 
     // ... 
    } 
} 

或者派生類,如

class Derived : BaseClass<Customer> 
{ 
    protected override bool HasAnyStuff(Customer customer) 
    { 
     // ... 
    } 
} 

,這依賴於如何使用派生類,您可以使用非泛型Customer參數覆蓋HasAnyStuff方法。

public bool HasAnyStuff(Customer customer) 
{ 
    // ... 
} 

但請注意,如果你不使用的DerivedClass實例工作的新HasAnyStuff不會被調用。也就是說,

BaseClass foo = new DerivedClass(); 
foo.HasAnyStuff(new Customer()); 

將調用BaseClass的通用方法,而不是DerivedClass的非泛型方法。

0

我有同樣的用例,你正在尋找。在基類中有一個通用的方法,我想重寫只有一種類型的方法。對於所有其他類型,我希望該方法的行爲方式相同。這是一個基於你的問題的簡單例子。

class BaseClass 
{ 
    protected virtual bool HasAnyStuff<TObject>(TObject obj) 
    { 
     return false; 
    } 
} 

class DerivedClass : BaseClass 
{ 
    protected override bool HasAnyStuff<TObject>(TObject obj) 
    { 
     if (typeof(TObject) != typeof(AlarmTran)) return base.HasAnyStuff<TObject>(obj); 

     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
} 

您也可以反轉if邏輯來處理多種不同類型的覆蓋。

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    if (typeof(TObject) == typeof(AlarmTran)) 
    { 
     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
    else if (typeof(TObject) == typeof(...)) 
    { 
     ... 
     return ...; 
    } 

    return base.HasAnyStuff<TObject>(obj); 
} 
0

約翰·卡彭特的答案類似,您可以覆蓋與同泛型方法泛型方法,而只是使用as運營商檢查和它轉換爲所需的類型。這具有使用空測試來檢查轉換是否有效的附加好處。

基類

protected virtual bool HasAnyStuff<TObject>(TObject obj) 
{ 
    .... // base implementation 
} 

繼承

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    var customer = obj as Customer; 
    if (customer == null) // conversion failed. object is not of type Customer 
    { 
     return base.HasAnyStuff(obj); 
    } 

    .... // do stuff with the customer 
}