2014-09-15 3 views
4

Я хочу иметь базовый класс с вложенным классом внутри него - и развернуть вложенный класс в дочернем классе: По какой-то причине - я не могу получить доступ к вложенному производному классу NEW (добавлены) свойства:Расширение вложенного класса в производном классе C#

public class BaseClass 
{ 
    public NestedClass nestedClass {get; set;} 
    public BaseClass() 
    { 
     nestedClass = new NestedClass(); 
    } 
    public int baseproperty {get; set;} 
    public class NestedClass 
    { 
     public int NestedProperty {get; set;} 
    } 
} 

public class Derived : BaseClass 
{ 
    public class NestedClass 
    { 
      public DeeperNestedClass deeper {get; set;} 
      public NestedClass() 
      { 
       deeper = new DeeperNestedClass(); 
      } 
      public class DeeperNestedClass 
      { 
       public int VeryDeepPropery {get; set;} 
      } 


    } 
} 

Derived MyDerived = new Derived(); 
MyDerived.nestedClass.deeper <----- Doesn't recognized ! 

* редактировать - исправлен недостающий «класс» в базовом классе

+1

Почему вы хотите использовать 'partial' здесь? –

+1

В этом коде 'BaseClass.NestedClass' не связан с' Derived.NestedClass'. Они будут считаться двумя разными классами. –

+0

@ user54321 Вы правы как B.K. Я удалил его. – Dani

ответ

3

Вы в основном есть три проблемы:

1) Вы на самом деле должны получают Derived.NestedClass от BaseClass.NestedClass.

2) Ваша недвижимость BaseClass.nestedClass всегда будет иметь тип BaseClass.NestedClass, поэтому вам необходимо бросить ее для доступа к объекту deeper.

3) Вы должны убедиться, что на объекте BaseClass.nestedClass имеется объект типа Derived.NestedClass при доступе в Derived.

public class BaseClass { 
    public NestedClass nestedClass { get; set; } 

    public BaseClass() { 
     nestedClass = new NestedClass(); 
    } 

    public int baseproperty { get; set; } 

    public class NestedClass { 
     public int NestedProperty { get; set; } 
    } 
} 

public class Derived : BaseClass { 
    public Derived() { 
     nestedClass = new NestedClass(); 
    } 

    public class NestedClass : BaseClass.NestedClass { 
     public DeeperNestedClass deeper { get; set; } 

     public NestedClass() { 
     deeper = new DeeperNestedClass(); 
     } 

     public class DeeperNestedClass { 
     public int VeryDeepPropery { get; set; } 
     } 
    } 
} 

class Program { 
    static void Main(string[] args) { 
     Derived derived = new Derived(); 
     BaseClass.NestedClass nestedBase = derived.nestedClass; 
     Derived.NestedClass nestedDerived = (Derived.NestedClass)nestedBase; 
     Derived.NestedClass.DeeperNestedClass deeper = nestedDerived.deeper; 
     int property = deeper.VeryDeepPropery; 
    } 
} 

Edit после обсуждения в комментариях: Может быть что-то простое, как это будет работать для вас?

public class OuterClass { 
    public OuterClass() { 
     nestedClass = new NestedClass(); 
    } 

    public int baseproperty { get; set; } 
    public NestedClass nestedClass { get; set; } 
} 

public class NestedClass { 
    public NestedClass() { 
     deeper = new DeeperNestedClass(); 
    } 
    public int NestedProperty { get; set; } 
    public DeeperNestedClass deeper { get; set; } 
} 

public class DeeperNestedClass { 
    public int VeryDeepPropery { get; set; } 
} 

class Program { 
    static void Main(string[] args) { 
     OuterClass outer = new OuterClass(); 
     int property = outer.nestedClass.deeper.VeryDeepPropery; 
    } 
} 
+0

Это довольно круто, что вы получили его на работу ... но это примечание того кода, с которым я бы хотел иметь дело. –

+0

@ B.K. Это правда! Я никогда не буду писать такой код в производственном приложении. – cremor

+0

Это класс C#, который должен быть сопоставлен с JSON-схемой из внешнего источника. Я не могу изменить JSON, поэтому я вынужден использовать такую ​​структуру. но вопрос о OOP - расширение производного вложенного класса ... Я проверяю, работает ли это решение – Dani

3

Прежде всего, вы должны указать, что NestedClass является class и partial во время его декларации:

public partial class NestedClass // You forgot those two here... 
{ 
    public int NestedProperty { get; set; } 
} 

Кроме того, вы не можете разделить вложенный класс на два отдельных класса, даже если один из них происходит от другого. Вы можете сделать это только в исходном базовом классе, если вы разделили его и отметили как частичное: http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.120).aspx

Хорошо .. по крайней мере, не в здравом смысле. cremor, похоже, разобрался в работе, но я бы избежал такого кода.

+0

Спасибо, я действительно имел это в своем коде.пропустил его здесь, поэтому он не решает проблему, я исправлю это в вопросе описания – Dani

+1

@ Дани Я предоставил ссылку для вас, чтобы прочитать. Это из MSDN, и речь идет о том, как вы можете разделить вложенный класс ... однако вы не сможете выполнить его, разделив его на производный класс. –

+0

Вы правы - Partial здесь не подходит. Я удалил его. спасибо за статью link – Dani

2

Вы не можете иметь частичные классы, вложенные в разные классы.

В противном случае, каково было бы это полное имя?

Namespace.BaseClass.NestedClass или Namespace.Derived.NestedClass? Было бы неразумно, если бы разные имена относились к одному классу.

По этой же причине вы не можете иметь его в разных пространствах имен.

Возможным решением было бы создать интерфейс:

interface INested { } 

И сделать свой BaseClass родовое:

class BaseClass<T> where T : INested, new() 
{ 
    public T Nested { get; set; } 
    public BaseClass() 
    { 
     Nested = new T(); 
    } 
} 

class Derived : BaseClass<NestedImpl> 
{ 
    Derived() 
    { 
     Nested = new NestedImpl(); 
    } 

    public class NestedImpl : INested 
    { 
     public int deeper {get;set;} 
    } 
} 
+0

Я понял, что у меня есть проблема здесь, но нет ли решения OOP для расширения вложенного класса в производном классе? – Dani

+0

Существует более одного хорошего решения, в зависимости от случая. Вы можете, например, создать интерфейс 'INestedClass' и ваш' BaseClass , где T: INestedClass' – Andre

+0

@Dani - почему бы и не получить вложенный класс? Или у вас есть *, чтобы иметь эту функциональность в базовом вложенном классе? Почему бы не реализовать его там в первую очередь? – Corak

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