Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口上的私有成员_C#_.net - Fatal编程技术网

C# 接口上的私有成员

C# 接口上的私有成员,c#,.net,C#,.net,我对整个C#有点陌生,但基本上我在为我正在开发的应用程序编写一个基于插件的架构。每个插件都需要一些基本的东西,比如我有一个如下的界面: interface IPlugin { string Username {get;} string Password {get;} } 问题是用户名和密码只在实现接口的类中使用,因此不需要公开 这意味着我不能使用接口,因为它只允许是公共的。我想我可以使用一个抽象类,但是我需要在类成员上添加什么样的正确访问修饰符,这样我就可以实现它,当我从类继承时,

我对整个C#有点陌生,但基本上我在为我正在开发的应用程序编写一个基于插件的架构。每个插件都需要一些基本的东西,比如我有一个如下的界面:

interface IPlugin
{
   string Username {get;}
   string Password {get;}
}
问题是用户名和密码只在实现接口的类中使用,因此不需要公开

这意味着我不能使用接口,因为它只允许是公共的。我想我可以使用一个抽象类,但是我需要在类成员上添加什么样的正确访问修饰符,这样我就可以实现它,当我从类继承时,我可以看到它

我尝试了下面的方法,但是没有成功,我知道为什么没有成功,我只是不知道正确的修饰符是什么

abstract class Plugin
{
  private string Username;
}

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

接口只公开公共方法和属性,这是正确的。不能在接口中设置访问修饰符

根据您的情况,创建摘要可能是一种正确的方法。要使字段或属性仅对从抽象类继承的类可见,应使用
protected
access修饰符

有关更多信息:

在您的示例中:

abstract class Plugin
{
   protected string Username;
}

class Imp : Plugin
{
  public Imp()
  {
      this.Username = "Taylor"; // No error here...
  }
}

尝试使用
protected
修饰符,以便可以从子类访问字段

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

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

您可以省略
base
accesor或改用
this
,但我曾经明确地声明我正在更改的内容。它使代码更具可读性,不那么模棱两可

您正在查找
受保护的
修饰符。

我想您正在查找
受保护的
关键字,如下所示:

abstract class Plugin
{
    protected string Username;
}

正确的修改器受保护。在这种情况下,您使用抽象类而不是接口是正确的-接口是一种契约,这样外部世界就知道实现者的一些功能,而抽象类可能(并且经常这样做)包含一些逻辑和该逻辑使用的受保护成员。

正如其他人所说,正确的方法是将抽象类作为基类。这意味着只有您的
Imp
类才能访问
Username
。但是,您可以通过接口实现这一点,尽管不完全如此

interface IPlugin
{
    string Username { get; }
}

class Imp : IPlugin
{
    string IPlugin.Username
    {
        get { return "Taylor"; }
    }
}
关键是接口的显式实现。现在,您将无法执行以下操作:

new Imp().Username; //error 
((IPlugin)new Imp()).Username; //works
但您将能够做到:

new Imp().Username; //error 
((IPlugin)new Imp()).Username; //works
在显式实现中,
Username
仅对接口实例公开,而不是对派生类型实例公开


至于为什么不允许私有,请参见

您是否试图通过接口强制私有实现?是的,您可以在不使用
的情况下访问,但我想明确指出,我正在设置父类的字段。使用此字段还是基字段会有任何区别吗,例如,若您回溯到抽象类,使用base而不是this关键字是否有益?不,这并没有任何区别。唯一的情况是当您在子类中有另一个
Username
字段时,然后当您添加
base
修饰符时—您将访问基类的字段,在其他情况下—当前类的字段<代码>如果您回溯到抽象类则访问类的引用类型无关紧要。很抱歉,您的代码不会编译。您必须将
Username
初始化放入构造函数或方法中。@IlyaIvanov更正。固定的。