我是整个C#的新手,但基本上我正在为一个正在开发的应用程序编写一个基于插件的架构。每个插件都需要有一些基本的东西,因此我有一个如下界面:
interface IPlugin
{
string Username {get;}
string Password {get;}
}
问题是用户名和密码只会在实现界面的类中使用,因此不需要公开它。
这意味着我无法使用界面,因为它只允许公开。我以为我可以使用一个抽象类,但是我需要将一个正确的访问修饰符放在一个类成员上,以便我可以实现我可以在从类继承时看到它。
我尝试了以下但它从未奏效,我知道它为什么没有,我只是不知道正确的修饰符是什么。
abstract class Plugin
{
private string Username;
}
class Imp : Plugin
{
this.Username = "Taylor";
}
答案 0 :(得分:2)
尝试使用protected
修饰符,以便可以从子
abstract class Plugin
{
protected string Username;
protected string Password;
}
class Imp : Plugin
{
public Imp()
{
base.Username = "Taylor";
base.Password = "Pass";
}
}
您可以省略base
访问者或使用this
代替,但我过去常常明确说明我要更改的内容。它使代码更具可读性和模糊性。
答案 1 :(得分:1)
您说错了,接口只公开Public方法和属性。您无法在接口中设置访问修饰符。
根据您的情况,创建摘要可能是一种正确的方法。要使字段或属性仅对从抽象类中继承的类可见,您应该使用protected
访问修饰符。
有关详细信息: protected access modifier
在你的例子中:
abstract class Plugin
{
protected string Username;
}
class Imp : Plugin
{
public Imp()
{
this.Username = "Taylor"; // No error here...
}
}
答案 2 :(得分:1)
您正在寻找protected
修饰符。
答案 3 :(得分:1)
我认为您正在寻找protected
关键字,如下所示:
abstract class Plugin
{
protected string Username;
}
答案 4 :(得分:1)
正确的修饰符为protected
。在这种情况下,你是正确的使用抽象类而不是接口 - 接口是一个契约,所以外部世界知道实现者的一些功能,而抽象类可能(并且经常)包含一些逻辑和该逻辑使用的受保护成员
答案 5 :(得分: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
仅对接口实例公开,而不是派生类型实例。
至于为什么不允许私有,请参阅Non Public Members for C# Interfaces