Защищенный член виден пользователю

Это будет мой первый вопрос здесь, поэтому, пожалуйста, будьте снисходительны.

Как это возможно:

//there is a Form1 class which has a TableAdapter member generated by designer...
partial class Form1
{
    private void InitializeComponent()
    {
         this.SomeTableTableAdapter = new SomeDatabaseDataSetTableAdapters.SomeTableTableAdapter();
    }

    private SomeDatabaseDataSetTableAdapters.SomeTableTableAdapter SomeTableTableAdapter;
 }

//here is this TableAdapter class
//It has PROTECTED member called "Adapter"
public partial class SomeTableTableAdapter : global::System.ComponentModel.Component
{
    protected internal global::System.Data.SqlClient.SqlDataAdapter Adapter
    {
    }
}

//and in the constructor of Form1 class I can do something like this:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.SomeTableTableAdapter.Adapter.InsertCommand.CommandText = @"INSERT INTO (...)";
    }
}

Почему я получаю доступ к защищенному элементу, поскольку Form1 не наследуется от SomeTableTableAdapter?


person listerreg    schedule 11.08.2012    source источник
comment
Пожалуйста, используйте функции сайта, чтобы отвечать на ответы, например оставлять комментарии. Поскольку это сайт вопросов и ответов, ответы, которые на самом деле не являются ответами, будут удалены. Не забудьте пометить ответ как принятый.   -  person GSerg    schedule 11.08.2012


Ответы (2)


Свойство Adapter объявлено как protected internal, что означает, что оно доступно для производных классов (protected) и для классов в той же сборке (internal). Поскольку Form1 находится в той же сборке, что и SomeTableTableAdapter, они могут получить доступ к внутренним элементам друг друга.

person Thomas Levesque    schedule 11.08.2012

protected internal означает защищенный ИЛИ внутренний. Доступ разрешен либо из производных классов, либо из содержащей сборки.

Модификаторы доступа (Руководство по программированию на C#):

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

person GSerg    schedule 11.08.2012