2011-01-18 10 views
3

は:C#の - クラスのデザイン&アクセス修飾子次を考える

public abstract class Base 
{ 
    // other stuff 

    public static void StaticMethod() 
    { 
    PrivateMethod(); 
    } 
    // here should be PrivateMethod() declaration somehow 
} 
public sealed class Derived: Base 
{ 
    // other stuff 

    public void InstanceMethod() 
    { 
    // call somehow PrivateMethod 
    PrivateMethod(); 
    } 
} 

私は2つの異なるコンテキスト(異なるアセンブリ)からPrivateMethod()を使用するようにする必要があります。一度Base.StaticMethod()を呼び出し、派生クラスd.InstanceMethod();のインスタンスを使用して2回目を呼び出します。

私は、基本クラス内でPrivateMethod()を設計する方法を探しています。もちろん、PrivateMethod()はBaseクラスとDerivedクラスの外では表示できません。

私は何かについて考えていた

「保護された静的PrivateMethodを(){}」が、私は、私はそれを行うべきではありません読んで...

あなたはみんなが何をお勧めですか?

+0

要件を変更することができます。この場合、別の解決策が見つかるでしょうが、この特定のケースでは選択可能な静的メソッドが1つしかありません。 –

+1

あなたはそれをしてはいけないとお伝えしていますが、なぜそれをしないのですか? –

+0

私はここで考えています:http://blogs.msdn.com/b/brada/archive/2004/09/09/227332.aspxしかし、ブラッドはこれを「避ける」ことを提案しますが、「使用しない」ことに注意してください。 –

答えて

2
protected static void PrivateMethod() {} 

あなたが必要とするものはOKですか? Derivedから呼び出すときはbase.は必要ありません。

+0

ありがとうございました。問題は、私がこのリンクをチェックした後、私がこの質問を始めたことです:http://blogs.msdn.com/b/peterhal/archive/2005/06/29/434070.aspx ...多分私はそこに何かを納得できないと思いますか? – Learner

+0

多分私は記事の最後の段落を忘れてしまいました... – Learner

+0

(クイックリード後)著者はこれを「セキュリティとしてカプセル化」の観点から考えています。 libデザイナーには有効ですが、アプリケーションには関係ありません。ポイントは次のように思われる:あなたはそれについて正直でそれを公開するかもしれない。 –

2

私は以前これを聞いたことがなかったので、あなたが説明したことを言ったものを探しに行った。私はこの記事を見つけました:New Design Guideline: Avoid Protected Static。ただし、保護された静的フィールドについてのみ説明しています。

私は、記事が実際に何を言おうとしているのかが良いとは思わないと思います。保護された統計がどのように複雑になるかを記述するのではなく、すべての人がアクセスすべきでないものに対して適切なアクセスフラグを設定しない、基本クラスのデザイナーの非常に簡単な例を使用します。

言われていることは、静的保護が合併症につながる可能性があるという点です。 Protected staticは、任意のサブクラスがいつでもメソッドを呼び出すことができることを意味します。これは、メソッドが純粋に記述されていれば、スレッドの安全性の問題につながる可能性があります。それは記事が "あなたがそれをする必要がある場合は注意してください"よりむしろ "しないでください"と伝えるように書かれているようです。

+0

あなたのお薦めいただきありがとうございます。本当に助かった!乾杯! – Learner

0

派生クラスのInstanceMethod()から公開StaticMethod()を呼び出すことができます。なぜなら、とにかくPrivateMethod()に間接的に戻ってくるからです。そうすれば、PrivateMethod()を非公開にすることができます。それがパラメータとして渡された、または反射を経て決定することができたのいずれかのパブリック発信者または(InstanceMethodから)派生クラスの発信者を区別するためにStaticMethodの間が必要とされている場合:

public abstract class Base 
{ 
    // other stuff 

    public static void StaticMethod() 
    { 
    PrivateMethod(); 
    } 

    // here should be PrivateMethod() declaration somehow 
    private static void PrivateMethod() 
    { 
    // do stuff 
    } 
} 
public sealed class Derived: Base 
{ 
    // other stuff 

    public void InstanceMethod() 
    { 
    // call somehow PrivateMethod 
    StaticMethod(); 
    } 
} 

PS:実装は次のようなものになるだろう。

+0

"Artur Mustafin"のようなものを指摘したいと思っていますが、あなたのソリューションをありがとうございます。 InstanceMethodは、StaticMethodではなくPrivateMethodを呼び出す必要があります – Learner

関連する問題