即使字段被暴露,也强制使用属性与类字段交互

Dra*_*tar 1 c# field properties

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

public abstract class DrawableSurface
{       
protected Rectangle m_Rect;

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

etc. ...  
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

子类可以访问字段,也可以不访问 - 就像那样简单.您不能让他们访问该字段"只是为了将值直接作为参数传递给另一个方法".

我个人认为它是私有领域,但暴露受保护的财产:

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

// Only expose a setter if you need it.
protected Rectangle { get { return m_rect; } }
Run Code Online (Sandbox Code Playgroud)

如果你能多谈谈其中矩形需要作为方法的参数的情况下,我们可能能够进一步帮助...但你必须接受至少具有读取访问子类之间的根本选择Rectangle参考或不 - 没有中间立场.

除了其他任何东西,如果你可以让他们访问Rectanglejust以将其传递给另一个方法,那么阻止他们编写如下代码:

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

private void SneakyMethodWithRectangle(Rectangle rectangle)
{
    // Ha ha! I have access to the rectangle! 
}
Run Code Online (Sandbox Code Playgroud)