继承递归

本文关键字:递归 继承 | 更新日期: 2023-09-27 18:28:48

所以我试图在代码中实现一些继承,因为我有许多类需要与我作为参数传递的其他类相同的实例,但现在我遇到了一个递归问题,我不太明白为什么。

它打断了ParentScreen类(这只是一个普通类,没有XAML)——也许这不是解决我这个简单问题的最佳方法?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        ParentScreen ps = new ParentScreen();
        container.Children.Add(ps.ms);
    }
}
public class ParentScreen : UserControl
{
    public MainScreen ms;
    public ParentScreen()
    {
        ms = new MainScreen(); // breaks here
    }
}
public partial class MainScreen : ParentScreen
{
    public MainScreen()
    {
        InitializeComponent();
    }
}
<runtime:ParentScreen x:Class="WpfApplication1.MainScreen"
        xmlns:runtime="clr-namespace:WpfApplication1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        Height="100" Width="200">
    <Grid>
        <TextBox Height="23" Margin="12,12,0,0" Name="textBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120" />
    </Grid>
</runtime:ParentScreen>

继承递归

我认为有两个问题:

  • 您混合了"实例"answers"类"概念当A继承了B,并且你建立了一个新的A,那么你只有一个A的实例,而不是两个实例(A&B)

  • 当继承并放置默认CTor时,会自动调用基本CTor。这意味着这个代码:

    公共分部类MainScreen:ParentScreen{公共MainScreen(){InitializeComponent();}}

与相同

public partial class MainScreen : ParentScreen
{
    public MainScreen() : base()
    {
        InitializeComponent();
    }
}

所以当你打电话给

ParentScreen ps = new ParentScreen();

发生了什么:

  • ParentScreen.CTor=>ms=新的MainScreen()
  • MainScreen.CTor=>ParentScreen.CTor(因为MainScreen继承自ParentScreen)=>ms=new MainScreen()
  • MainScreen.CTor=>ParentScreen.CTor
  • ParentScreen.CTor=>ms=新的MainScreen()

etc(无限loo)

它应该是stackoverflowException?

当您创建一个子类时,它将首先调用其父类的构造函数。

using System;
class Parent
{
  private Client m_client;
  public Parent()
  {
    m_client = new Client();
    Console.WriteLine("client inited");
  }
}
class Client: Parent
{
  public Client()
  {
    //..
  }
}
class Test
{
  public static void Main(string[] args)
  {
    Client c = new Client();
    Console.WriteLine("End");
  }
}

运行上面的代码,它会在MacOS上运行Mono时导致unSegment错误。

看看窗户里发生了什么。

:)