ただし、そのセッターをインターフェイスの内部としてマークしたいので、誰かが 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 で public メソッドを宣言する必要があり、戻り値の型を宣言したい場合はうまく機能しませんが、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
ことさえできない抽象メソッドがあるためです。しかし、これは、API のどこでも使用できることを意味します。CustomerBase
これが野田時間の暦体系の最終的なアプローチであり、最初に計画を思いついたときにブログに書きました。私は通常、抽象クラスよりもインターフェイスを好みますが、ここでの利点は大きかったです。