2017-12-28 73 views
1

추상 클래스를 속성 유형으로 사용하는 것을 방지 할 수 있습니까?추상 클래스를 속성 유형으로 사용하지 못하도록

제네릭 형식의 추상 클래스에서 상속되는 추상 기본 클래스가 있습니다. 제네릭 형식은 정의 된 형식의 클래스에서 상속됩니다. 제네릭 형식으로 추상 클래스를 "잠그는"것이 가능한가? 그래서 다른 클래스의 속성으로 사용할 수는 없습니까?

다음은 내 상황을 대략적으로 나타낸 것입니다. doubleFoo2과 같은 속성을 만들지 않도록하고 싶습니다. Foo<T>은 다른 클래스에서 상속 될 수 있어야하며 직접 유형으로 사용할 수 없어야합니다.

속성과 기본 유형이 PropertyType 인 것을 확인하고 있기 때문에 실수로 나를 찾아 내는데 시간이 걸렸습니다. 여기에 코드의 테스트입니다 : 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

* 가능 "잠글 수 있나요 "제네릭 형식의 추상 클래스이므로 다른 클래스의 속성으로 사용할 수 없습니까? * 아니요, 불가능합니다. 르.왜 그런 걸 신경 쓰나요? 무엇을 성취하려고합니까? – CodingYoshi

+0

'내부'또는 '개인'으로 설정해야합니까? – JohnyL

+0

@ 코딩 요시 필자는 다음과 같이 썼습니다. "속성 유형과 기본 유형의 PropertyType을 검증했기 때문에 실수로이 점이 발견되어서 시간이 많이 걸렸습니다." 나는. 나는 실수를 다시 피하고 싶다. – Oystein

답변

4

이뿐만 아니라 그것은, 그것은 객체 지향 프로그래밍의 세 가지 기본 원칙 중 하나에 대해 불가능가는 것은 - 나는 물론, 대한 polymorphism을 이야기하고있다.
다형성 포기는 객체 지향 프로그래밍을 포기합니다.

요점은 유형의 참조가 참조 유형에서 파생 된 모든 유형의 인스턴스를 실제로 참조 할 수 있다는 것입니다.

다형성 다음 코드 라인 (심지어 매우 유용 아니지만) 완벽하게 유효한 무슨 수 있습니다 :

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

감사합니다. 나는 다형성에 대해서만 들었고 많은 것을 알지 못했다. 그것에 대해 읽을 시간. :-) – Oystein

0

편집 : 어떤 @Zohar 펠 레드 말한 것은, 그것은 제한, 다형성의 목적을 패배처럼 사용이 기반 네임 스페이스 또는 어셈블리가 유일한 방법입니다.

DoubleFoo와 그 하위 클래스는 별도의 어셈블리에서 생성하는 경우, 당신은 대신

내부

수정을 사용할 수 있습니다

공공

FooBase 및 Foo 클래스 모두에 대해

다른 어셈블리가 액세스하지 못하도록 방지합니다.

동일한 어셈블리에서이 DoubleFoo를 사용해야하는 경우 기본 구현 클래스를 숨기려면 기본 클래스를 다른 네임 스페이스에 배치 해 볼 수 있습니다. 예제는 다음과 같습니다

내부 FooOfT.cs에게

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 FooHandler.cs

내부

using FooTester.DoubleFoo.Foo 

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

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 클래스를 만들고 해당 네임 스페이스에서 다형성을 유지할 수 있습니다. –