メソッド/プロパティをあるクラスには表示し、他のクラスには非表示にする
-
23-08-2019 - |
質問
授業があります Server
これは IRC のサーバー接続と通信します。既知のリストを保持します User
s を作成し、必要に応じて作成します。
に関する 2 つの問題があります。 User
クラス:
- 誰でもインスタンスを作成できます
User
. 。私が欲しいのはServer
これができるクラスです。 - ユーザー(物)の場合、
User
説明) が自分の名前 (または参加しているチャンネルなどの他の情報) を変更すると、Server
クラス自体を変更できます。ただし、他のクラスでも可能です。他のクラスがこの情報に触れることを禁止したい(読み取り専用にしたい)。
これら 2 つの問題を解決するにはどうすればよいでしょうか?C++ では、次のようにすることで解決できます。 friend
キーワードとctorの作成と setName
(など)プライベート。
指定されたクラスから特定のメソッドにアクセスできるようにする C# キーワードはありますか?これで私の問題は解決します。
解決
正直にはどのように friend
アクセスするからC++への対症の悪いデザイン。いないほうがよいの固定に設計されるようお願いします。
のための、本当にうればを作成します。なので本当に問題なのか?私はこの思いることをプログラマに取得した気になれば分からないことだらこんなことはないでしょう、そうなれば、ではどちらでも構いません。
ればならないかもしれませんのケアそして次のいずれかの操作を行います:
- ユーザーインターフェース.サーバのインスタンスを生成できるプライベートクラスを実装しままたは
- ユーザーの内部クラスのサーバーのないpublicコンストラクタでのみサーバのインスタンスを生成できます。
視認性hacksの友C++では、パッケージのアクセスJavaの両方が良い例ではないトラブルのない良い方法がありました。
他のヒント
.NET の世界で最も近いもの friend
それは internal
視認性。
2 つのクラスが別々のアセンブリにある場合は、 内部の可視先 属性を使用して、一方のアセンブリの内部を他方のアセンブリの可視化できるようにします。
あなたのクラス階層を再設計することは、おそらくこの問題の公正な解決策です。それはあなたが本当に必要なもののように私に聞こえるので、それはServerクラスの外に存在するとき、読み取り専用のユーザークラスです。
私はおそらくこのような何かをするだろう
// An abstract base class. This is what I'd use outside the
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties.
public abstract class User
{
protected User()
{
}
public string Name { get;}
// Other get-only properties
}
public class ServerUser : User
{
public ServerUser()
{
}
public string Name { get; set;}
// Other properties.
}
次に、サーバ・クラスを作成ServerUserクラス、ユーザーサーバ・クラス(ユーザー名の変更など)ServerUserクラスのプロパティを変更するだけで外の世界へのユーザークラスを公開するを持っています。