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