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";
    }
}

您可以省略baseaccesor 或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

You are looking for the protected modifier.

于 2013-01-20T13:22:44.963 回答
1

I think you're looking for the protected keyword, like this:

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

The correct modifier is protected. You are right about using an abstract class and not interface in this case - interface is a contract so that the outside world knows some capabilities of the implementors, while abstract class may (and often does) contain some logic and protected members used by that logic.

于 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 回答