2016-04-22 7 views
0

ジェネリックスを使用して.NET同等物を理解しようとしています(数年前にJavaをやっていました)。ここで私は何をしたいのためにいくつかの擬似コードです: 抽象基本クラスのプロパティで汎用コレクションを使用できますか?

abstract base class MyBase 
abstract property string Name; 
abstract property ObservableCollection<T> SubItems; 

は、それから私は、それぞれが異なる電子う2つのプロパティと、コレクション内のオブジェクトの種類を実装しmyBaseから継承する2つのクラスを持っています。

class Real1 : MyBase 
    property string Name 
    property ObservableCollection<SomeClass> SubItems; 

class Real2 : MyBase 
    property string Name 
    property ObservableCollection<SomeDifferentClass> SubItems; 

点は、これらの項目は(XAML結合のため)同じプロパティ名を持っているすべての子要素を必要とTreeViewコントロールにバインドできるようにすることです。共通のタイプの新しいコレクションを作成する必要がある場合は、それぞれを繰り返し処理する必要があり、コレクションが大きくなります。私はオリジナルのコレクションデータを管理しないので、それらのクラスを変更することはできません。

+4

擬似コードを書くのではなく、[mcve]を書くことができますか?基本的にはMyBaseを汎用的にする必要があるようですが、MyBase とMyBase を作成する必要があります.2つのサブクラスが必要なことは明らかではありません。 –

+0

サブクラスのプロパティの実装がベースクラス(ジェネリック型以外)と異なるのはなぜですか? –

答えて

3

あなたは、一般的な基本クラスをしたいようですね:

abstract class MyBase<T> 
{ 
    public abstract string Name {get; set;} 
    public abstract ObservableCollection<T> SubItems {get; set;} 
} 

class Real1 : MyBase<SomeClass> 
{ 
     public override string Name {get; set;} 
     public override ObservableCollection<SomeClass> SubItems {get; set;} 
} 

class Real2 : MyBase<SomeDifferentClass> 
{ 
     public override string Name {get; set;} 
     public override ObservableCollection<SomeDifferentClass> SubItems {get; set;} 
} 

しかしプロパティの実装が異なっている場合を除き、あなたは抽象基本クラスを必要とする理由私は見ていない、そしてそれははっきりしていませんなぜサブクラスが必要なのか?定義済みのサブタイプを持たずにMyBase<SomeClass>を作成することができます。

0

私はStanleyに同意します。あなたが抽象クラスを作成できるからといって、あなたがするべきではありません。ここでは、抽象クラスが必要ですシナリオは次のとおりです。

は例

public static class AnimalHelper { 
    public static string NotifySound(this Animal animal) { 
     return animal. GetType().Name + " " + animal.Sound.ToString() + "s"; 
    } 
} 

のために、あなたは動物の音を処理し、何かをする静的クラスにメソッドを作成していると仮定今ここであなたを知りませんそれはSoundTypeですしたがって、抽象クラスを作成します。

public abstract class Animal { 
    public abstract SoundType Sound{get;} 
} 

public enum SoundType{ 
    Bark, 
    Roar, 
    Meow 
}  

public class Dog:Animal { 
    public override SoundType Sound { get { return SoundType.Bark; } } 
} 

public class Lion:Animal { 
    public override SoundType Sound { get { return SoundType.Roar; } } 
} 

ここでは、OOPのパワーを使用してサウンドを処理する汎用メソッドを作成しました。私はこれが抽象化を使用するための正しい視点を与えることを願っています。

関連する問題