2011-11-04 21 views
8

C#を使用しています。他のメタ情報の中に有向グラフのルートノードを含むクラスがあります。これをコンテナクラスとしましょう。このコンテナは、エディタモードとコンフィグレータモードの2つの異なるモードで表示できます。モードに応じて、ルートノードのタイプは同じです。NodeEditまたはNodeConfigは、どちらも同じサブクラスを継承します。コンテナの継承されたプロパティの型を継承型に変更する

public abstract class NodeBase 
{ 
    string Name { get; set; } 
    ... 
} 

public class NodeEdit : NodeBase ... 
public class NodeConfig : NodeBase ... 

、私はまた、基本クラスを作成し、それを継承:

public abstract class ContainerBase 
{ 
    NodeBase Root { get; set; } 
    ... 
} 

ContainerBaseから継承してEditorのとConfiguratorcontainerのためのクラスを作成、私はのタイプになりたい場合は - ルート(NodeBaseから継承)プロパティの特定は次のように入力します。

public class ContainerEditor : ContainerBase 
{ 
    NodeEditor Root { get; set; } 
    ... 
} 

しかし、私はContainerBaseで定義されたプロパティの種類を変更することはできません。この問題を解決する方法はありますか?私はBaseNode型を使用し、型NodeEditorが型BaseEditorから継承されているので

ContainerEditorInstance.Root = new NodeEditor(); 

ようNodeEditorの要素を追加しますが、コンテナエディタクラスで、私は明示的のみのタイプを許可することができますルートプロパティはNodeEditorです。 私はsetterでこれをチェックし、NodeEditor型のノード以外のすべてのノードを拒否できますが、プロパティを特定の型にしたいので、コンパイル時に間違った割り当てを検出できます。事前に

おかげで、
フランク

答えて

4

:だから、あなたはこのような何かを書きたい

public class ContainerEditor : ContainerBase 
{ 
    public NodeEditor Root { 
    get { return (NodeEditor)base.Root; } 
    set { base.Root = value; } 
    } 
    ... 
} 
+0

こんにちはマーク、返信いただきありがとうございます!私はすでに再宣言でそれを試していましたが、おそらく私は間違ったことをしました。私はあなたのアプローチをテストし、それは正常に動作します!一般的に、ジェネリックスまたはその逆の方が再宣言が優先されるべきか、それとも同等であるべきなのでしょうか? – Aaginor

+0

この全体のジェネリックなものは、ジェネリックベースクラスを使用する必要がある場合、つまり抽象的な型の戻り値として使用する場合に重大な問題を引き起こしています。だから私は再宣告をするつもりです、それはあまり邪魔にならないようです。 「新規」および「上書き」と比較して、内部宣言の再宣言はどのように機能していますか?それについてお勧めすることができる良い記事はありますか?再度、感謝します! – Aaginor

9

使用ジェネリック:あなたはタイプを指定し、派生クラスで

public abstract class ContainerBase<TRoot> where TRoot : NodeBase 
{ 
    TRoot Root { get; set; } 
    ... 
} 

public abstract class ContainerBase<T> where T:NodeBase 
{ 
    T Root { get; set; } 
    ... 
} 

public class ContainerEditor : ContainerBase<NodeEditor> 
{  
    ... 
} 
+0

こんにちはブラウを、通常のHashSetのと同様の使用方法の横にジェネリック医薬品を扱ったことがありません。これはおそらく彼らと一緒に働く良い時だと思う! – Aaginor

1

あなたは、コンテナの一般的な基盤を作ることができます

public class ContainerEditor : ContainerBase<NodeEditor> 
{ 
    ... 
} 
+0

良いアイデア、私はそれを撃つだろう。 – Aaginor

0

ここで良い解決策はGenericsです。あなたはそれを再宣言することができます

public class ContainerEditor<T>:ContainerBase 
{ 
    T Root {get;set;} 
} 
+0

エディタまたはコンフィグレータを知らなくても機能にアクセスできるように、ContainerBaseのルートを宣言する必要があります。とにかくジェネリックはGuffaやBlauのような良いアイデアのように聞こえる。 – Aaginor