1

我有一个基类,项目中的所有可绘制元素都使用它。它拥有一个 Rectangle,它需要暴露给所有子类,因为它需要在各种情况下作为参数传入。超级直接:

public abstract class DrawableSurface
{       
protected Rectangle m_Rect;

public Vector2 Position
    {
    get { return m_Rect.Location; }
    set { m_Rect.Location = value; }   
    }     

etc. ...  

该矩形的区域、位置等通常与类的区域和位置同义,但我想强制执行所有客户端(继承基类)必须通过类的属性与矩形交互的约定。换句话说,我有一个客户可以访问的受保护类,以便他们可以将其传递给函数,但我从不希望他们执行任何直接的 m_Rect.Whatever 访问。

是否有执行此约定的好方法(除了文档?)

4

2 回答 2

5

子类要么可以访问该字段,要么不能——就这么简单。您不能让他们访问该字段“只是为了将值直接作为参数传递给另一个方法”。

就我个人而言,我会将其设为私有字段,但要公开受保护的属性:

// Make it readonly if possible...
private Rectangle m_rect;

// Only expose a setter if you need it.
protected Rectangle { get { return m_rect; } }

如果您可以详细说明需要将矩形作为方法参数的情况,我们可能会提供进一步的帮助……但是您需要接受子类之间的基本选择,这些子类是否至少具有对Rectangle引用的读取访问权限- 没有中间立场。

除此之外,如果您可以让他们访问Rectangle只是将其传递给另一个方法,那么阻止他们编写如下代码的方法是:

public void DoSomething()
{
    SneakyMethodWithRectangle(RectangleJustForPassing);
}

private void SneakyMethodWithRectangle(Rectangle rectangle)
{
    // Ha ha! I have access to the rectangle! 
}
于 2013-07-19T18:21:39.373 回答
0

只需更改 to 的可见m_Rectprivate

于 2013-07-19T18:21:30.900 回答