Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Compiler Error CS1540 
:(
    Опции темы
QryStaL
Дата 21.8.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Although a derived class can access protected members of its base class, it cannot do so through an instance of the base class. 

Код

class A
{
    protected void Do()
    {
    }
}

class B : A
{
    public void Do2()
    {
        A obj = new A();
        B obj2 = new B();
        obj.Do(); // Здесь ошибка компиляции CS1540
        obj2.Do();
    }
}


С чем связано такое ограничение?


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Partizan
Дата 21.8.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



QryStaL, 
с тем, что в данном случае B выступает в роли клиента класса A, а protected поля не доступны клиентам.

всё дело в семантике использования класса A


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
QryStaL
Дата 21.8.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Цитата(Partizan @  21.8.2008,  15:33 Найти цитируемый пост)
а protected поля не доступны клиентам.

Не совсем понятна эта фраза. Если я напишу след. код:

Код

class C
{
    private int v = 1;
    public static void Do()
    {
        C obj = new C();
        obj.v = 2;
    }
}


то все нормально скомпилится.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Partizan
Дата 21.8.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



QryStaL, а почему этот код не должен скомпилиться? Класс C знает о своём внутреннем устройстве посему и внутри себя он как хочет может манипулировать объектами этого класса


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
QryStaL
Дата 21.8.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Partizan, правильно, по той же логике в первом примере класс B унаследован от класса A и поэтому имеет доступ к его protected членам.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Partizan
Дата 21.8.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



QryStaL, в одном случае класс является клиентом сам себя, а во втором один класс является клиентом второго класса


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
pr0fess0r
Дата 25.8.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 15.8.2008

Репутация: нет
Всего: 1



 protected void Do() использование ограничено классом, в котором он определен

из MSDN:

Error Message
Cannot access protected member 'member' via a qualifier of type 'type1'; the qualifier must be of type 'type2' (or derived from it)


Although a derived class can access protected members of its base class, it cannot do so through an instance of the base class.

The following sample generates CS1540:

Код

// CS1540.cs
public class Base
{
   protected void func()
   {
   }
}

public class Derived : Base
{
   public static void test(Base anotherInstance)
   // the method declaration could be changed as follows
   // public static void test(Derived anotherInstance)
   {
      anotherInstance.func();   // CS1540
   }
}

public class Tester : Derived
{
   public static void Main()
   {
      Base pBase = new Base();
      // the allocation could be changed as follows
      // Derived pBase = new Derived();
      test(pBase);
   }
}


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.