强制使用属性与类字段交互,即使该字段已公开

本文关键字:字段 交互 属性 | 更新日期: 2023-09-27 18:23:54

我有一个基类,我的项目中的所有可绘制元素都使用它。它拥有一个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访问。

有没有一个好的方法来执行这个约定(除了文档?)

强制使用属性与类字段交互,即使该字段已公开

要么子类有权访问字段,要么没有——就这么简单。不能"仅仅为了将值作为参数直接传递给另一个方法"而授予它们对字段的访问权限。

就我个人而言,我会将其设为一个私人字段,但会暴露一个受保护的属性:

// 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! 
}

只需将m_Rect的可见性更改为private