2012-03-24 9 views
0

私はパラメータとして渡す他のクラスの同じインスタンスを必要とする多くのクラスを持っているので、私はコードにいくつかの継承を実装しようとしましたが、今はなぜ私は非常に理解していない再帰問題が発生します。継承再帰

これは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> 
+1

parentScreenオブジェクトを作成するとき、コードはmainScreenオブジェクトを作成するコンストラクタを呼び出します。 MainScreenオブジェクトはParentScreenから継承するので、新しいparentScreenオブジェクトを作成するだけで、parentScreenコンストラクタをもう一度呼び出すことができます。 - > StackoverflowExcepetion ?! –

+0

ああそう、私は...おっと!それを指摘してくれてありがとう! – Michael

+1

解決策(と問題)をちょっと言い直す必要があります。e。これは、WPFユーザーコントロールでの再利用を処理する最も幸せな方法ではなく、何らかの理由で問題に終わることになります。これは単なる明白なバグでした:)しかし、あなたはより困難に遭遇する可能性があります。継承は、GUI/WPFコンポーネント、および最高の匂いがないWPFの場合には最良の選択ではありません。 WPFの周りでは、MVVMを介して物事を試して実装することをお勧めします。さまざまなコントロール用のデータテンプレート - 最後の手段としてのみカスタムコーディングコントロールに頼っています - それはあなたを助け、あなたに向かってベストを導きます – NSGaga

答えて

2

は、2つの問題がある:

  • あなたは「インスタンス」と「クラス」のコンセプト 継承Bを混合している、とあなたは、あなたが1つしかない新しいAをインスタンス化します(A & B)

  • デフォルトのCTorを継承すると、ベースのCTorが自動的に呼び出されます。

    パブリックパーシャルクラスMainScreen:このコードを意味するParentScreen {パブリックMainScreen(){ のInitializeComponentを(); }}

はより同じものです:あなたが呼び出すので

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

起こっ何

ParentScreen ps = new ParentScreen(); 

  • ParentScreen.CTor =>ミリ秒=新しいMainScreen();
  • MainScreen.CTor => ParentScreen.CTor(MainScreenは ParentScreenから継承するため)=> ms =新しいMainScreen();
  • MainScreen.CTor => ParentScreen.CTor
  • ParentScreen.CTor => ms = new MainScreen();

など(無限LOO)

0

これで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が実行されているときにセグメントエラーが発生します。

Windowsで何が起きているか確認してください。

:)