我最近遇到了一个界面,它只定义了一个像这样的setter:
public interface IAggregationView
{
DataTable SetSiteData { set; }
}
我质疑这一点,并且相信这是微软为WebPart设计(针对SharePoint)所倡导的做法之一。实际上,这个例子直接从他们的例子中复制过来。
我认为这是一个糟糕的模式,我不明白为什么有人应该能够设置一个值,然后再也无法再读它了,我相信一个二传手应该总是伴随一个吸气剂(但是不一定相反)。
我想知道是否有人可以解释只有一个二传手的好处,为什么微软可能会在这种情况下建议它,以及它是否真的是一个好的模式?
答案 0 :(得分:22)
有两种情况我可以看出这可能是合理的:
void SetPassword(string)
方法替换它,个人重申我的第一点,如果消费API本质上是一个为属性分配值的自动映射器,那么Set...
方法可能并不理想;在那种情况下,属性确实更可取。
重新启用“我不明白为什么某人应该能够设置一个值,然后再也无法读取它” - 但同样地,可能有人认为有人设置了值已经知道了值(他们设置了它),因此没有要求来执行此操作。
但是是的;拥有一个只有一个属性的属性是非常罕见的。
答案 1 :(得分:15)
get
和set
在界面属性中的角色与类中的角色略有不同。
public interface IAggregationView
{
DataTable SetSiteData { set; }
}
class AggregationViewImp : IAggregationView
{
public DataTable SetSiteData { get; set; } // perfectly OK
}
接口指定属性至少具有公共setter。 getter的定义和可访问性留给实现类。
因此,如果接口合同只需要写,get
可以保持打开状态。无需要求公众获得。
因此,您无法在接口中真正指定只读属性。只有'至少读取权限'。
interface IFoo
{
int Id { get; }
}
class Foo : IFoo
{
public int Id { get; set; } // protected/private set is OK too
}
答案 2 :(得分:4)
我可以想象将它用于(手动)依赖注入。一个类可能需要注入一个仅在内部使用的协作者。当然,人们通常会选择在类的构造函数中执行此操作,但有时可能会希望在运行时更改协作者。
答案 3 :(得分:2)
实现接口的类可能会添加一个getter。该属性的大多数用途可能是通过实现类,而不是通过接口本身。在这种情况下,大多数代码都能够获取和设置属性。接口的唯一原因可能是存在一些公共代码来访问类族的方法/属性的公共子集。该代码只需要setter,而不是getter。界面记录了这一事实。
接口只是用于声明“原子需要”的一组操作的工具(例如,如果需要调用方法A,则需要读取属性B并设置属性C)。
一如既往,取决于。
答案 4 :(得分:1)
根据我的经验,这些界面由于某些特殊需要而出现,而不是出于架构原因。例如,在ASP.NET应用程序中,人们有时会使Global.asax生成的类型在需要维护全局状态时从这样的接口派生。有人可能会在应用程序的单独部分中创建初始化值,并需要将其发布到全局位置。
我通常喜欢用SetXxx
方法替换一个只设置属性,并使方法检查它最多被调用一次。这样我就可以明确地执行"初始化风格"这不是一种气味(imho)。
当然,人们不能设置从不生成这样的东西,但是要避免它,并且肯定会在代码审查期间提出问题。