使用接口作为字段类型,但让基类选择派生的结构

时间:2014-03-02 01:20:01

标签: c# interface usability

标题可能有点不合情理,但我会尽量在这里尽可能清楚地解释这种情况。我创建了一个将由其他人创建的类继承的类。我的类包含一个使用我创建的IShape接口的shape struct变量,如下所示:

IShape Bounds = new Rectangle(/*arguments go here*/);

如何让最终用户控制使用哪种形状,同时仍允许他访问所选形状的方法和字段(无需拆箱24/7)?基本上我希望用户选择他想要的形状,但仍然具有IShape形式的形状来执行诸如碰撞之类的东西。 E.g:

Bounds = new Triangle(/*arguments*/);
Bounds.Point3 = new Point(20f, 20f); //this property would be from the Triangle : IShape struct only and is not inherited from IShape

是否有方法或解决方法可以让最终用户轻松实现这一目标?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用具有接口约束的泛型类。所以宣言看起来像是:

public class MyClass<TShape> where TShape : IShape
{
    protected TShape Bounds;
    //Rest of class
}

或者,您可以通过一个通用方法提供对形状的访问,该方法可以集中进行转换:

public class MyClass
{
    private IShape Bounds;

    protected TShape GetBounds<TShape>() where TShape : IShape
    {
        return (TShape)Bounds; //Note this will throw an exception if the wrong shape is specified
    }
    //Rest of class
}

如果基类应该负责了解自己的形状类型,那么前者更合适。如果基类应该不知道它的形状类型,后者更合适,而继承类(或者如果你公开的话,调用类)应该知道。

然而,虽然这些解决方案中的一个可能非常适合您的情况,但根本不需要这样做会产生一些代码味道。如果您的课程在大多数时间必须知道并跟踪特定的具体课程,那么使用界面并不重要。最好的解决方案可能是改变你的设计,虽然如果没有看到更多的东西就很难给出建议。