簡體   English   中英

嵌套類中的繼承C#

[英]Inheritance in nested classes C#

精美代碼的粉絲。

我想通過兩種方式問我的問題。 可能對我有所了解。

1)有2類代碼。 其中之一是嵌套的。 嵌套類用於訪問另一類的私有字段。 我想繼承具有相同功能的B:A {class BUnit:AUnit {}}類,但在B和BUnits類中還有更多方法和字段。 怎么做?

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Add();
        a.Add();
        a.Add();
        bool res=a[0].Rename("1");//res=true;
        res = a[1].Rename("1");//res= false;
        Console.ReadKey();
    }
}
class A
{
    private List<AUnit> AUnits;
    public AUnit this[int index] {get {return AUnits[index];}}

    public A()//ctor
    {
        AUnits = new List<AUnit>();
    }
    public void Add()
    {
        this.AUnits.Add(new AUnit(this));
    }

    public class AUnit
    {
        private string NamePr;
        private A Container;
        public AUnit(A container)//ctor 
        {
            NamePr = "Default";
            this.Container = container;
        }
        public string Name { get { return this.NamePr; } }
        public Boolean Rename(String newName)
        {
            Boolean res = true;
            foreach (AUnit unt in this.Container.AUnits)
            {
                if (unt.Name == newName) res = false;
            }
            if (res) this.NamePr = String.Copy(newName);
            return res;
        }
    }
}

2)有兩個非常相似的“事物” — A類和B類。是否可以將它們的共同部分分開,然后從中“繼承”這兩個“事物”? 例如,我想添加一些方法,例如GetUnitsCount()或RemoveUnit(),並且這兩種方法都是通用的。 因此,我應該將此方法“復制粘貼”到A和B,但這不是一個好主意。 最好一次更改一次它們的公用部分。 做到這一點並不重要-繼承,接口或其他任何東西。 重要-如何?

 class Program
 {
    static void Main(string[] args)
    {
        A a = new A();
        a.Add();
        a[0].objB.Add();
        a[0].objB.Add();
        a[0].objB[0].Val1 = 1;

        int res = a[0].objB[0].Val1 + a[0].objB[0].Val2;

        Console.ReadKey();
    }
}
class A
{
    private List<AUnit> Units;
    public AUnit this[int index] {get {return Units[index];}}

    public A()//ctor
    {
        Units = new List<AUnit>();
    }
    public void Add()
    {
        this.Units.Add(new AUnit(this));
    }

    public class AUnit
    {
        private string NamePr;
        private A Container;
        public B objB;
        public AUnit(A container)//ctor 
        {
            NamePr = "Default";
            this.Container = container;
            this.objB = new B();
        }
        public string Name { get { return this.NamePr; } }
        public Boolean Rename(String newName)
        {
            Boolean res = true;
            foreach (AUnit unt in this.Container.Units)
            {
                if (unt.Name == newName) res = false;
            }
            if (res) this.NamePr = String.Copy(newName);
            return res;
        }
    }
}


class B
{
    private List<BUnit> Units;
    public BUnit this[int index] { get { return Units[index]; } }

    public B()//ctor
    {
        Units = new List<BUnit>();
    }
    public void Add()
    {
        this.Units.Add(new BUnit(this));
    }

    public class BUnit
    {
        private string NamePr;
        private B Container;
        public int Val1{get;set;}
        public int Val2{get;set;}
        public BUnit(B container)//ctor 
        {
            NamePr = "Default";
            this.Container = container;
            this.Val1 = 10;
            this.Val2 = 17;
        }
        public string Name { get { return this.NamePr; } }
        public Boolean Rename(String newName)
        {
            Boolean res = true;
            foreach (BUnit unt in this.Container.Units)
            {
                if (unt.Name == newName) res = false;
            }
            if (res) this.NamePr = String.Copy(newName);
            return res;
        }
    }
}

謝謝您的關注。

要回答第一個問題,讓BUnitAUnit繼承的唯一需要AUnit就是限定 AUnit 資格

public class BUnit : A.AUnit
{
    ....
}

從那里開始,我相信您的問題是關於基本繼承的,對於嵌套類而言,基本繼承沒有什么不同。 嵌套類僅用於組織-當您繼承“包含”類時,它們不會被繼承。

暫無
暫無

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

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