2017-12-28 24 views
1

抽象クラスをプロパティタイプとして使用できないようにすることはできますか?抽象クラスをプロパティタイプとして使用しないようにする

抽象クラスに抽象クラスが継承されていますが、抽象クラスはジェネリック型で継承されています。ジェネリック型で抽象クラスを「ロックダウン」することは可能なのですか?他のクラスのプロパティとして使用することはできません。

これは私の状況の近似です。私はdoubleFoo2のようなプロパティを作成する可能性を避けたいです。 Foo<T>は、他のクラスで継承することができ、型として直接使用することはできません。

プロパティとその基本タイプのPropertyTypeを検証しているので、これは間違いを引き起こしてしまいます。ここでは、コードのテストです: - についてpolymorphism、もちろん、私は話しているhttps://dotnetfiddle.net/OMHmGv

public abstract class FooBase 
{ 
    // Various generic properties and methods 
} 

public abstract class Foo<T> : FooBase 
{ 
    public Type ValueType { get { return typeof(T); } } 
    public abstract T Value { get; set; } 
} 

public class DoubleFoo : Foo<double> 
{ 
    public override double Value { get; set; } 
} 

public class FooHandler 
{ 
    public DoubleFoo doubleFoo1 { get; set; } 
    public Foo<double> doubleFoo2 { get; set; } 
} 
+0

内部

namespace FooTester.DoubleFoo.Foo { public abstract class FooBase { // Various generic properties and methods } public abstract class Foo<T> : FooBase { public Type ValueType { get { return typeof(T); } } public abstract T Value { get; set; } } } 

インサイドDoubleFoo.cs

using FooTester.DoubleFoo.Foo namespace FooTester.DoubleFoo { public class DoubleFoo : Foo<double> { public override double Value { get; set; } } } 

*それは「ロックダウンすることが可能です"ジェネリック型の抽象クラスなので、他のクラスのプロパティとして使用することはできませんか?*いいえ、それは可能ではありませんル。なぜそんなことを気にしているのですか?あなたは何を達成しようとしていますか? – CodingYoshi

+0

'internal'または' private'にする必要がありますか? – JohnyL

+0

@コーディングヨシ私はこう書いています。「プロパティとその基本タイプのPropertyTypeを検証しているので、これは間違いを引き起こしてしまいます。私。私は再び間違いをしないようにしたい。 – Oystein

答えて

4

だけでなく、それはそれはオブジェクト指向プログラミングの三つの基本原則の一つに反し、不可能です。
多態性を放棄することは、オブジェクト指向プログラミングを完全に放棄しています。

タイプの参照は、参照型から派生するすべての型のインスタンスを実際に参照できるということです。

多型はどのような次のコード行を作ることは(たとえ非常に有用ではありませんが)完全に有効です:

object s = "the type is actually a string but the reference is of type object"; 
+0

ありがとうございます。私は多型について聞いたことがあり、それについてはあまり知らない。それを読む時間。 :-) – Oystein

0

編集:@Zohar Peledは、それがベースの使用を制限し、多型の目的に反し、言ったことのように名前空間またはアセンブリが唯一の方法です。

DoubleFooとその子クラスが別々のアセンブリで作成された場合、代わりの

内部

修飾子を使用することができ

公共

FooBaseとFooクラスの両方のための

他のアセンブリがアクセスできないようにします。

同じアセンブリでこのDoubleFooを使用する必要がある場合は、基本クラスを別の名前空間に配置して、基本実装クラスを隠すことができます。 例は次のようになります。

インサイドFooOfT.cs FooHandler.cs

using FooTester.DoubleFoo 

namespace FooTester 
{ 
    public class FooHandler 
    { 
     public DoubleFoo doubleFoo1 { get; set; } 
     // public Foo<double> doubleFoo2 { get; set; } Cannot access Foo<T> class 
    } 
} 
+0

すべてのクラスは同じアセンブリにあります。しかし、基本クラスに別の名前空間を使用することをお勧めします。少なくとも私はusing文が追加される必要があるという警告を得るでしょう。(うまくいけば)私はおっぱいを作りようとしています。:-) – Oystein

+1

あなたがクラスを使用しようとすると警告が表示されます別の名前空間。この方法を使用する場合でも、DoubleFoo名前空間に異なるタイプの子Fooクラスを作成し、その名前空間に多形性を保持することができます。 –

関連する問題