私は自分のサイトの支払いシステムを作成しています。ユーザーは、支払う複数の支払いプロバイダの1つを選択できますが、すべて同じ方法で動作する必要があります。私はこのように、この動作を表現するために考えた:抽象クラスのみに継承者を知らせる
public abstract class PaymentProvider {
private static var methods = Dictionary<String,PaymentProvider>
{
{"paypal",new PaymentProviderPaypal()},
{"worldpay",new PaymentProviderWorldpay()}
}
public static Dictionary<String,PaymentProvider> AllPaymentProviders
{
get {return methods;}
}
public abstract pay();
}
public class PaymentProviderPaypal : PaymentProvider {
public override pay() {
}
}
public class PaymentProviderWorldpay : PaymentProvider {
public override pay() {
}
}
あなたはPaymentProvider.AllPaymentProviders["key"].pay()
を書くことで、これを使うことになっています。このクラスを使用する関数は、基本的な支払いプロバイダがどのように実装されているかを知る必要はなく、単にキーを知る必要があるという考えがあります。
ただし、PaymentProvider
クラスにアクセスすると、継承クラスにアクセスすることもできます。継承クラスの新しいコピーをインスタンス化し、それらを予期しない方法で使用することが可能です。継承クラスをカプセル化して、抽象的なPaymentProvider
だけがそれらについて知っているようにしたいと思います。
どうすればよいですか? protected
のような異なる保護レベルはここでは機能しません - Javaでは、protected
は、名前空間の他のクラスだけがそのクラスを使用できることを意味しますが、C#では何か他のものを意味します。
私はここに適切なアイデアはありますか?あるいは私は別の方法を使うべきですか?
ない質問への答え:たとえば、.NETで '現在のアセンブリ(すべての名前空間)ですべてのものへのアクセスを提供しますinternal'、' protected'は相続にのみアクセス可能です。 – Jamiec
タイプを公開する上で 'AllPaymentProviders'に渡すために使用するキーを知っているユーザーに頼らなければならないという追加の利点は何ですか? –
@Jamiec私はMSDNでそれを見ました。しかし、このサイトはビジュアルスタジオの下にある「ウェブサイト」プロジェクトであり、アセンブリを使ったものであるため、予期せぬことが起こった場合は「内部」を使用したくありませんでした。 – Oliver