簡體   English   中英

在派生類C#中擴展嵌套類

[英]Expanding a Nested Class in derived class C#

我希望有一個基類,里面有嵌套類 - 並擴展子類中的嵌套類:由於某種原因 - 我無法訪問嵌套派生類NEW(添加)屬性:

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 !

*編輯 - 修復基類中缺少的“類”

首先,您必須在聲明期間指定NestedClass是一個classpartial class

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

此外,您不能將嵌套類拆分為兩個單獨的類,即使其中一個派生自另一個類。 您只能在原始基類中進行拆分並將其標記為部分: http//msdn.microsoft.com/en-us/library/wa80x488(v = vs20).aspx

好吧..至少不是一個理智的方式。 cremor似乎找到了解決辦法,但我會避開那種代碼。

你基本上有三個問題:

1)您實際上必須從BaseClass.NestedClass派生Derived.NestedClass

2)您的屬性BaseClass.nestedClass將始終具有BaseClass.nestedClass的類型,因此您需要將其BaseClass.NestedClass轉換為訪問deeper屬性。

3)在Derived訪問時,您必須確保屬性BaseClass.nestedClass實際上包含Derived.NestedClass類型的對象。

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;
   }
}

在評論中討論后編輯:也許這樣簡單的東西對你有用嗎?

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;
   }
}

您不能將嵌套在不同類中的部分類。

否則,它的全名是什么?

Namespace.BaseClass.NestedClassNamespace.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;}
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM