2008-10-14 3 views
1

У меня был коллега, увидев это на днях, и я не совсем понимаю, почему это произошло. Может ли кто-нибудь объяснить это?C# Наследование

Мы имеем Класс A:

using System; 
using System.Data; 

public class A 
{ 
    protected DataTable _table; 

    public A() 
    { 

    } 
} 

Мы имеем класса B, который наследует от класса А (предположим, что существует в том же пространстве имен):

using System; 

public class B : A 
{ 
    public B() 
    { 

    } 
} 

В конструктор класса В, если я попробуйте this._table, он не компилируется? Почему это не так?

Но чтобы заставить его работать, я должен добавить с помощью System.Data; и все работает нормально.

Почему .NET не делает это для меня? Так что, когда я пытаюсь получить доступ к защищенному члену, он знает, что его файл System.Data.DataTable?

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

+0

«если я попробую this._table». this._table не является полным заявлением. Что именно вы пытаетесь с этим сделать? –

+0

Если ваша проблема была просто отсутствующей точкой с запятой, я бы предложил просто удалить этот вопрос. –

+0

Не должны ли мы полностью квалифицировать наши типы в классе? Это была мантра, ввергнутая мне в голову, изучая C++ anwyay. – user10178

ответ

2

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

+0

«ничего, кроме публичного» или «ничего, кроме частного»? –

+0

только что зафиксировал, что dang semi-colon ... no dang intelli-sense здесь, чтобы исправить это для меня .. hehe – Miles

+0

Я не вижу проблем с использованием внутренних полей. YAGNI. –

3

Это не проблема языка - если что-нибудь, вы могли бы назвать это проблемой IDE, чтобы не добавлять инструкцию using при создании нового класса. Даже тогда, IDE не знает, что вы будете получать доступ к этому участнику, и я предпочитаю, чтобы мои «операции» были как можно более минимальными. В любом случае тот факт, что B extends A не сообщает компилятору ничего о том, в каких пространствах имен он должен искать типы, указанные в B.

Кроме того, я настоятельно рекомендую вам изменить свой доступ к члену _table, чтобы использовать свойство getter.

+0

В любом случае вам не нужна директива using. Например, вы можете написать: Console.WriteLine (_table); без проблем. –

+0

(О, и компоновщик не интересуется пространствами имен. Он заботится о сборках.) –

+0

Console.WriteLine ожидает объект, поэтому ему не нужен тип _table. –

0

Должно работать. Я просто попробовал, и он работает.

Проверьте, находятся ли оба класса в одном пространстве имен. Если это не так, не забудьте включить пространство имен класса A с , используя ключевое слово.

Проверьте, находятся ли оба класса в одной и той же сборке. Если это не так, не забудьте включить ссылку на сборку класса A в сборке класса B.

0

Фактически, я не думаю, что компилятор даже смотрит на _table, как только он видит DataTable и видит, что это неопределенный тип, он пропустит следующую строку, которая выглядит синтаксически корректной. Я думаю, даже если бы у вас была некоторая переменная junk после DataTable в классе B, вы все равно получили бы ту же ошибку.

0

Я согласен с тобой, что они должны использовать «геттеры/сеттеры» и просто настроить _table на приватное.

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

using System.Data; 

namespace WindowsApplication1 
{ 
    public class classA 
    { 
     protected DataTable _table; 

     public classA() 
     { 

     } 
    } 
} 

следующий файл:

namespace WindowsApplication1 
{ 
    public class classB : classA 
    { 
     public classB() 
     { 
      this._table = new System.Data.DataTable(); 
     } 
    } 
} 

и скомпилированные просто отлично.Я думал, что будет проблема с привязкой между всеми пространствами имен .Net, но это не так.

Спасибо за все комментарии/ответы.

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

  • Нет связанных вопросов^_^