Наследование рекурсии - PullRequest
0 голосов
/ 24 марта 2012

Поэтому я попытался внедрить некоторое наследование в мой код, потому что у меня есть много классов, которым требуются такие же экземпляры других классов, которые я передаю в качестве параметров, но теперь я сталкиваюсь с проблемой рекурсии, которую я не совсем понимаю, почему.*

Он ломается в классе 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>

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Я думаю, что есть 2 проблемы:

  • Вы смешиваете понятия "экземпляр" и "класс" Когда A наследует B, и вы создаете новую A, тогда у вас есть только один экземпляр A, а не 2 экземпляра (A & B)

  • При наследовании и установке CTor по умолчанию базовый CTor вызывается автоматически. Что означает этот код:

    открытый частичный класс MainScreen: ParentScreen { общедоступный MainScreen () { InitializeComponent (); } }

Это то же самое, что и

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

поэтому, когда вы звоните

ParentScreen ps = new ParentScreen();

Что случилось:

  • ParentScreen.CTor => ms = new MainScreen ();
  • MainScreen.CTor => ParentScreen.CTor (потому что MainScreen наследуются от ParentScreen) => ms = new MainScreen ();
  • MainScreen.CTor => ParentScreen.CTor
  • ParentScreen.CTor => ms = new MainScreen ();

и т. Д. (Бесконечный туалет)

0 голосов
/ 24 марта 2012

Это должно быть 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.

Проверьте, что происходит в Windows.

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...