2013-01-20 3 views
2

Im вид нового для всего C#, но в основном я пишу архитектуру с плагинами для приложения, над которым я работаю. Каждый плагин нужно будет иметь некоторые базовые вещи, как например у меня есть интерфейс следующим образом:Привилегированные пользователи по интерфейсу

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

Проблема заключается в том, что имя пользователя и пароль будут использоваться только внутри класса, реализующего интерфейс, как таковой нет необходимости чтобы сделать его общедоступным.

Так что это означает, что я не могу использовать интерфейс, так как это разрешено публиковать. Я думал, что могу использовать абстрактный класс, но что такое правильный модификатор доступа, мне нужно было бы добавить член класса, чтобы я мог реализовать его, я могу увидеть его, когда наследую класс.

Я пробовал следующее, но он никогда не работал, и я знаю, почему это не так, я просто не знаю, что такое правильный модификатор.

abstract class Plugin 
{ 
    private string Username; 
} 

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

Вы Тринг, чтобы заставить частную реализацию через интерфейс? – ryadavilli

ответ

2

Попробуйте использовать protected модификатор, так что поля могут быть доступны из subclases

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

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

можно опустить base accesor или использовать this вместо этого, но я ' я использовал для явного указания того, что я меняю. Это делает код более понятным и менее двусмысленным.

+0

+1 BTW, вы также можете вызвать 'this.Username' /' this.Password'. – digEmAll

+0

Да, вы можете получить доступ без 'this' и' base' вообще, но я хочу сделать явным, что я устанавливаю поле родительского класса. –

+0

будет ли какая-либо разница, используете ли вы эту или базу, например, если вы вернетесь к абстрактному классу, было бы полезно использовать базу вместо этого ключевого слова? –

1

Вы правы в том, что интерфейсы только раскрывают общедоступные методы и свойства. Вы не можете устанавливать модификаторы доступа в интерфейсах.

Учитывая ваш случай, создание абстрактного текста, вероятно, является правильным подходом. Чтобы сделать поле или свойство видимым только для классов, которые наследуют из вашего абстрактного класса, вы должны использовать модификатор доступа protected.

Для получения дополнительной информации: protected access modifier

В вашем примере:

abstract class Plugin 
{ 
    protected string Username; 
} 

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

Извините, но ваш код не компилируется. Вы должны поместить инициализацию 'Username' в конструктор или метод. –

+0

@IlyaIvanov Исправить. Исправлена. – Blachshma

1

Я думаю, что вы ищете protected ключевое слово, например:

abstract class Plugin 
{ 
    protected string Username; 
} 
1

Правильный модификатор protected. Вы правы в использовании абстрактного класса, а не интерфейса в этом случае - интерфейс - это контракт, так что внешний мир знает некоторые возможности разработчиков, в то время как абстрактный класс может (и часто) содержать некоторые логические и защищенные члены, используемые этой логикой ,

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

Смежные вопросы