我有一个容器类,它有一个泛型参数,它受限于某个基类。提供给泛型的类型是基类约束的子类。子类使用方法隐藏(新)来更改基类中方法的行为(不,我不能将其设为虚拟,因为它不是我的代码)。我的问题是没有调用“新”方法,编译器似乎认为提供的类型是基类,而不是子类,就好像我已经将它向上转换到基类一样。
显然,我在这里误解了一些基本的东西。我认为泛型where T: xxx
是一种约束,而不是向上转型的类型。
这个示例代码基本上演示了我在说什么。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericPartialTest
{
class ContextBase
{
public string GetValue()
{
return "I am Context Base: " + this.GetType().Name;
}
public string GetOtherValue()
{
return "I am Context Base: " + this.GetType().Name;
}
}
partial class ContextSub : ContextBase
{
public new string GetValue()
{
return "I am Context Sub: " + this.GetType().Name;
}
}
partial class ContextSub
{
public new string GetOtherValue()
{
return "I am Context Sub: " + this.GetType().Name;
}
}
class Container<T> where T: ContextBase, new()
{
private T _context = new T();
public string GetValue()
{
return this._context.GetValue();
}
public string GetOtherValue()
{
return this._context.GetOtherValue();
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Simple");
ContextBase myBase = new ContextBase();
ContextSub mySub = new ContextSub();
Console.WriteLine(myBase.GetValue());
Console.WriteLine(myBase.GetOtherValue());
Console.WriteLine(mySub.GetValue());
Console.WriteLine(mySub.GetOtherValue());
Console.WriteLine("Generic Container");
Container<ContextBase> myContainerBase = new Container<ContextBase>();
Container<ContextSub> myContainerSub = new Container<ContextSub>();
Console.WriteLine(myContainerBase.GetValue());
Console.WriteLine(myContainerBase.GetOtherValue());
Console.WriteLine(myContainerSub.GetValue());
Console.WriteLine(myContainerSub.GetOtherValue());
Console.ReadKey();
}
}
}
编辑:
我想我的困惑来自于可以做到这一点
class SomeClass<T> where T: AnotherType, new()
{
T foo = new T();
}
即使我理解编译器会将其视为具有的接口,我也希望T
如此。我假设即使接口是在编译时设置的,也会在运行时进行输入。该声明在这里似乎具有误导性,因为它确实在做T
T
AnotherType
T
T
T foo
AnotherType foo = new T();
一旦我明白它并没有真正声明foo
为 type T
,就可以理解为什么new
方法隐藏不起作用了。
这就是我要说的。