我想将继承类的成员限制为特定类型。我知道我可以用泛型类来做,但它似乎比应该更复杂。 所以,这是一个例子。
public class Shape
{
public Texture texture { get; set; }
}
public class Texture { ... }
public class SpecficTexture : Texture { ... }
public class SpecificShape : Shape
{
public SpecificShape()
{
texture = new SpecficTexture();
}
}
基本上,在我的情况下,我需要实现类SpecificShape。这一切都很好但是SpecificShape中的纹理属性并不是特定的纹理。从SpecificShape,它需要被称为这样。显然,我可以改为使用以下课程。
public class Shape2<T> where T : Texture
{
public T texture { get; set; }
}
public class SpecifShape2 : Shape2<SpecficTexture> { ... }
我看到了两个问题的解决方案。要么我去我的团队切换到使Shape成为泛型类,要么在需要时将纹理转换为SpecificTexture。还有其他办法吗?
我不喜欢铸造的想法,它对我来说似乎并不优雅,如果我不得不多次这样做,我会担心性能问题。与此同时,我不确定改变已经实施的内容是否合理。
答案 0 :(得分:0)
您可以在texture
中将Shape
属性设为虚拟,在SpecificShape
中覆盖它并将转换限制在一个特定位置:
public class Shape
{
public virtual Texture texture { get; set; }
}
public class SpecificShape : Shape
{
public SpecificTexture specificTexture { get; set; }
public override Texture texture
{
get { return specificTexture; }
set
{
if (value is SpecificTexture specificValue) //this is the only place we have to have a cast
{
specificTexture = specificValue;
}
else
{
//handle error, throw exception, Debug.Assert, or something
}
}
}
public SpecificShape()
{
specificTexture = new SpecificTexture();
}
}
每当您需要在SpecificShape类中使用SpecificTexture时,您只需使用specificTexture
属性而不是texture
。
此外,如果父Shape
类实际上不需要texture
属性设置器(也许,texture
属性只在构造函数中设置一次?),那么只需获取摆脱二传手,你可以避免任何演员。