替代泛型继承类,以将继承的属性约束为其基类型本身的子类

时间:2018-02-02 14:33:14

标签: c# generics inheritance

我想将继承类的成员限制为特定类型。我知道我可以用泛型类来做,但它似乎比应该更复杂。 所以,这是一个例子。

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。还有其他办法吗?

我不喜欢铸造的想法,它对我来说似乎并不优雅,如果我不得不多次这样做,我会担心性能问题。与此同时,我不确定改变已经实施的内容是否合理。

1 个答案:

答案 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属性只在构造函数中设置一次?),那么只需获取摆脱二传手,你可以避免任何演员。