2014-09-12 3 views
0

Довольно новый для C# - мне было поручено создать подкласс, чтобы сделать вариацию базового класса. Никогда не занимаясь подклассами раньше, я немного прочитал, а затем попробовал. Я мог получить доступ только к частной собственности MyClass из подкласса после наследования из базового класса. Что я здесь сделал? Является ли это истинным подклассом или каким-то вложенным наследующим?Подкласс или интерфейс C#?

public class MyClass 
{ 
    private string connString; 
    // exec stored procedure 1 

    public class MySubClass : MyClass 
    { 
      otherClass o = new otherClass(connString); 
      // exec stored procedure 2 
    } 
} 

Независимо от того, что я сделал, это работает. Кроме того, в то время как на тему подклассов существует ли общий способ назвать их? например MyClass_SubClass или _MyClass и т. Д.?

Большое спасибо!

Редактировать: Еще раз спасибо! Я думаю, что искал этот ответ here. Несмотря на это, я понял, что я неправильно понял задачу - вообще не нужно гнездовать или наследовать! Просто создал отдельный подобный класс.

+0

Я не совсем понимаю ваш вопрос, но причина, по которой вы можете получить доступ к частному полю * внешнего *, заключается в том, что он охватывает ваш внутренний класс, где вы делаете доступ. Это не имеет никакого отношения к подклассу. –

+0

Мне удалось получить доступ к частному полю при наследовании от базового класса, что было сбивает с толку. Переход на «protected» позволяет мне перемещать вложенный класс за пределы базы и все еще получать доступ к полю. – Shwarz

ответ

5

У вас есть вложенные ваши классы, которых вы, вероятно, избежите, пока не поймете C# и ООП лучше (а затем наследуете, что просто странно).

Подкласс или деривация, осуществляется через Наследование. В вашем примере:

public class MyClass 
{ 
    private string connString; 
    // exec stored procedure 1 
} 

public class MySubClass : MyClass 
{ 
     otherClass o = new otherClass(connString); 
     // exec stored procedure 2 
} 

Чтобы MySubClass получить доступ к члену MyClass, что элемент должен быть отмечен как protected или выше. private не могут быть доступны вне класса.

public class MyClass 
{ 
    protected string connString; 
    // exec stored procedure 1 
} 
+0

@KirkWoll Я не говорю, что нет допустимых вариантов использования для одного, но как новичок он должен использовать обычное наследование, а затем использовать вложенные классы, когда он может понять, когда они подходят для использования. Я лично вижу вложенные классы в качестве кодового запаха, но это только мое мнение. – BradleyDotNET

1

MySubClass - действительно MyClass.MySubClass. Обычно простой подкласс не имеет доступа к частным членам.

Обычный подкласс будет находиться в отдельном файле как отдельный класс. Если подкласс должен быть допущен к доступу к членам базового класса, тогда вы объявляете их как «защищенные», а не «частные».

Объект наименования, как правило, представляет собой тип, независимо от базового класса. Например, если у вас есть базовый класс Animal, разумно, что у вас есть подклассы Dog и Cat. Или в Windows вы можете иметь базовый класс под названием Control и подклассы, называемые Button, TextBox, Label и т. Д.

1

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass myClass = new MyClass(); 
     MyClass.MySubClass mySubClass = new MyClass.MySubClass(); 
    } 
} 

Это довольно необычно, это не редкость, чтобы иметь класс, объявленный в классе, но обычно вы бы не объявить MySubClass, как общественности, вы бы объявить его как частный или защищенный. Так ...

public class MyClass 
{ 
    private string connString; 
    private MyClassHelper mySubClass = new MyClassHelper(); 

    // exec stored procedure 1 

    protected class MyClassHelper 
    { 
     object o = new object(); 
     // exec stored procedure 2 
    } 
} 

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

Ответ BradleyDotNET говорит вам, как реализовать подкласс MyClass. Это также называется наследованием, чтобы узнать больше об этом здесь ...http://msdn.microsoft.com/en-us/library/ms173149(v=vs.80).aspx

Как слово предупреждения, я бы не стал слишком сумасшедшим с наследованием класса, существует множество типов отношений между классами, в сравнении class inheritance is quite restrictive.

Название вашего вопроса - это подкласс или интерфейс. Interfaces - это то, что вы должны смотреть и понимать, они очень важны для реализации кода SOLID. В моих классах кода наследуют интерфейсы гораздо чаще, чем наследуют классы.

+0

Это действительно хорошее объяснение. – BradleyDotNET

+0

@BradleyDotNET благодарит Брэда :) – Mick

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