继承递归
本文关键字:递归 继承 | 更新日期: 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错误。
看看窗户里发生了什么。
:)