2014-04-09 107 views
5

这是我以前从未注意到的,但最近碰到。当我遇到这种情况时,我惊讶于编译器认为是正确的,以及它迫使我做什么。我认为这是最容易通过例子来描述。当我向基类提供一个类型参数时,为什么我的子类仍然是泛型的?

比方说我们有一个通用的基类与单一的方法。

abstract class GenericBase<T> 
{ 
    public abstract T SomeMethod<T>(T value); 
} 

这里没什么疯狂的。现在,让我们扩展它,为int提供一个具体的实现:

class IntImplementation : GenericBase<int> // T is now, and forever shall be, int 
{ 
    public override int SomeMethod(int value) 
    { 
     return ++value; 
    } 
} 

看起来很简单,对不对?或者,所以我想......其实,你不能做到这一点。编译器会引发你的消息

'IntImplementation' 不实现继承的抽象成员 'GenericBase.SomeMethod(T)'

但是......现在Tint!为什么我不能在我的重写中替换这个?原来,只有接受倍率

public override T SomeMethod<T>(T value) 

这意味着我的方法现在已经是

public override T SomeMethod<T>(T value) 
{ 
    return ++((int)value); 
} 

哇,这不是一般的。事实上,我可能会从基础类沟渠泛型,并与良好的醇'object

介意。吹。我一直在困惑这背后的原因,但我无所适从。有人有任何想法吗?

+7

**这里没有什么疯狂的**?当然不是!你已经声明了两个不同的泛型类型参数,都被称为'T'。请不要这样做。你应该得到一个编译器警告,告诉你这是一个不好的做法,会导致代码混淆。 –

+0

我在一个答案和评论中得到了。这不公平。 :/ Dat泛型类型参数范围.... – Will

回答

23

通用方法中的T与包含类中的T没有任何关系,并且您应该会收到一条警告,告诉您这一点。 请阅读编译器警告;他们在那里为你的利益

如果您打算为SomeMethod是通用的,那么你应该写:

abstract class GenericBase<T> 
{ 
    public abstract U SomeMethod<U>(U value); 
} 

而现在很明显,GenericBase<int>不影响SomeMethod<U>可言。

或者如果它是你的意图SomeMethod根本不会被泛型化,然后不泛化它

abstract class GenericBase<T> 
{ 
    public abstract T SomeMethod(T value); 
} 

现在你可以重写SomeMethod你描述。

+0

哇。我的意思是,哇。我不知道他们被认为是完全不同的参数类型。 Brb,我会在下一个小时里冒充Vinnie Barbarino。哇!哇。 Whoooooah。 – Will

相关问题