但是,我想将该设置器标记为接口中的内部,因此不可能有人实现 ICustomer 并且程序集之外的人修改这些属性。有没有好的方法来做到这一点?
不,不幸的是,财产成员始终是公开的。此外,在接口上指定部分属性的访问级别搞乱会很痛苦,IIRC。你可以做的是:
public interface ICustomer
{
string FirstName { get; }
string SecondName { get; }
}
internal interface ICustomerWithSetMethods : ICustomer
{
void SetFirstName(string name);
void SetLastName(string name);
}
public class Customer : ICustomerWithSetMethods
然后从外面看,它看起来Customer
只是 implements ICustomer
,但从内部你的代码会看到它 implements ICustomerWithSetMethods
。
不幸的是,如果您的 API 需要声明任何您真正想声明返回类型为 的公共方法,这并不能很好地发挥作用ICustomer
,但您实际上会知道它总是ICustomerWithSetMethods
.
假设您仍然希望允许多个实现,您可能会选择一个抽象类:
public abstract class CustomerBase
{
public abstract string FirstName { get; }
public abstract string LastName { get; }
internal abstract void SetFirstName(string name);
internal abstract void SetLastName(string name);
}
CustomerBase
现在我们有点奇怪,程序集之外的任何人都无法扩展您的CustomerBase
.
这就是我们在Noda Time中最终为日历系统采用的方法——当我第一次想出这个计划时,我在博客上写过它。我通常更喜欢接口而不是抽象类,但这里的好处是显着的。