2

私はC#全体に少し新しいですが、基本的には、作業中のアプリ用のプラグインベースのアーキテクチャを作成しています。すべてのプラグインには、次のようなインターフェイスがあるなど、いくつかの基本的なものが必要です。

interface IPlugin
{
   string Username {get;}
   string Password {get;}
}

問題は、ユーザー名とパスワードがインターフェースを実装するクラス内でのみ使用されるため、公開する必要がないことです。

つまり、公開のみが許可されているため、インターフェイスを使用できません。抽象クラスを使用できると思っていましたが、実装できるようにクラスメンバーに配置する必要がある正しいアクセス修飾子は何ですか?クラスから継承したときにそれを確認できます。

私は次のことを試しましたが、うまくいきませんでした。なぜうまくいかないのか、正しい修飾子が何であるかわかりません。

abstract class Plugin
{
  private string Username;
}

class Imp : Plugin
{
  this.Username = "Taylor";
}
4

6 に答える 6

2

修飾子を使用してprotected、サブクラスからフィールドにアクセスできるようにしてください

abstract class Plugin
{
  protected string Username;
  protected string Password;
}

class Imp : Plugin
{
    public Imp()
    {
        base.Username = "Taylor";
        base.Password = "Pass";
    }
}

baseアクセサーを省略したり、this代わりに使用したりできますが、私は変更内容を明示的に示していました。これにより、コードが少し読みやすくなり、あいまいさが少なくなります。

于 2013-01-20T13:22:40.510 に答える
1

インターフェイスがパブリックメソッドとプロパティのみを公開するという点で正しいです。インターフェイスにアクセス修飾子を設定することはできません。

あなたの場合を考えると、要約を作成することはおそらく正しいアプローチです。フィールドまたはプロパティを抽象クラスから継承protectedするクラスにのみ表示するには、アクセス修飾子を使用する必要があります。

詳細情報:保護されたアクセス修飾子

あなたの例では:

abstract class Plugin
{
   protected string Username;
}

class Imp : Plugin
{
  public Imp()
  {
      this.Username = "Taylor"; // No error here...
  }
}
于 2013-01-20T13:22:34.000 に答える
1

protected修飾子を探しています。

于 2013-01-20T13:22:44.963 に答える
1

protected次のようなキーワードを探していると思います。

abstract class Plugin
{
    protected string Username;
}
于 2013-01-20T13:22:47.427 に答える
1

正しい修飾子はprotectedです。この場合、インターフェースではなく抽象クラスを使用するのは正しいです-インターフェースは、外部の世界が実装者のいくつかの機能を知っているようにするためのコントラクトですが、抽象クラスには、そのロジックによって使用されるいくつかのロジックと保護されたメンバーが含まれる場合があります(多くの場合、含まれます)。 。

于 2013-01-20T13:23:21.937 に答える
0

他の人が言ったように、正しいアプローチは、基本クラスとして抽象クラスを持つことです。これは、Impクラスのみがにアクセスできることを意味しますUsername。しかし、正確ではありませんが、インターフェースを使用してそれに近いものを実現できます。

interface IPlugin
{
    string Username { get; }
}

class Imp : IPlugin
{
    string IPlugin.Username
    {
        get { return "Taylor"; }
    }
}

重要なのはexplicit implementationインターフェースです。今、あなたはすることができなくなります:

new Imp().Username; //error 

しかし、あなたはできるでしょう:

((IPlugin)new Imp()).Username; //works

明示的な実装でUsernameは、はインターフェイスインスタンスにのみ公開され、派生型インスタンスには公開されません。

プライベートが許可されない理由については、C#インターフェイスの非パブリックメンバーを参照してください。

于 2013-01-20T13:38:20.887 に答える