我正在练习我的协方差,试图全力以赴。
我已经开发了两种类似的方法,一种不变的方法可以按您的预期工作,但是缺少一些高级类型功能,而一种协变量的方法却给我一个错误。
#region Animals
public abstract class Animal { };
public class Lemur : Animal { };
#endregion
public interface IExhibit<out T> where T : Animal
{
}
#region Poster
public interface IPoster<out T> where T : Animal
{
string GetHeadline();
}
public class Poster<T> : IPoster<T> where T : Animal
{
public string GetHeadline()
{
return typeof(T).ToString();
}
}
#endregion
public class Zoo
{
List<IExhibit<Animal>> exhibits;
List<Poster<Animal>> posters;
public void AddExhibit(IExhibit<Animal> newExhibit) //option 1
{
exhibits.Add(newExhibit);
posters.Add(new Poster<Animal>()); //poster will just say "animal"
}
public void AddExhibit<T>(IExhibit<T> newExhibit) where T : Animal
{
exhibits.Add(newExhibit);
posters.Add(new Poster<T>());
}
}
希望我所做的足够直观。我知道有很多方法可以做到这一点,但是由于我对理论更感兴趣,因此我试图使这种事情起作用。整个前提是
public void AddExhibit<T>(IExhibit<T> newExhibit) where T : Animal
比
更有用public void AddExhibit(IExhibit<Animal> newExhibit)
因为它更具体,我想利用您可以访问类型T的事实。我只是使协方差起作用。我怀疑问题是我使用的是Poster而不是IPoster,但是由于IPoster是一个接口,您无法实例化它。