2009-07-05 4 views
2

보호 된 생성자가있는 클래스와 MustInherit으로 표시된 클래스의 차이점은 무엇입니까? (나는 VB.Net에서 프로그래밍 중이지만 아마도 C#에도 동일하게 적용됩니다).보호 된 생성자 및 MustInherit/Abstract 클래스

왜냐하면 내가 공유 클래스/정적 메소드로 생성자를 변환하고자하는 추상 클래스가 있기 때문입니다. (제약 조건을 추가하려면).

공유 기능에서 인스턴스를 만들 수 없기 때문에이 작업을 수행 할 수 없습니다.

MustInherit 키워드를 삭제하려고합니다. 이것은 어떤 변화를 가져올 것입니까?

감사합니다.

ETA :

나는 나는 경우 MustInherit 키워드를 제거하면, 나는 더 이상 매우 유용한 MustOverrides을 포함 할 수 없다, 내 질문에 대답 것 같아요.

그 점을 염두에두고 내 문제를 해결할 방법이 있습니까?

, η2 : 나는이 경우 MustInherit 키워드를 제거하지 않는

는 명확히하기 위해, 나는 다음과 할 수없는 이유는 무엇입니까?

Public MustInherit MyBaseClass 

    Private Sub New() 
    End Sub 

    Protected Function CreateInstance(ParmList) As MyBaseClass 
    If ParmList is Ok Then Return New MyBaseClass() 
    End Function 

End Class 
+0

당신이 말하는 언어를 나타내야합니다. – womp

+0

고마워, 그게 vb.net 또는 C# – Jules

답변

1

당신은 반사를 사용하여 Protected 생성자를 호출하고 클래스를 인스턴스화하지만 당신은이 방법에 abstract 클래스를 인스턴스화 할 수 없습니다 수 있습니다. MustInherit 클래스에 MustOverride 메서드를 선언 할 수 있지만 Protected 생성자는 파생 클래스에 아무 것도 적용하지 않을 수 있습니다.

개념 상 추상적 인 클래스는 항상 MustInherit으로 선언해야합니다. Protected 생성자는 파생 클래스에 더 많은 기능을 제공하기 위해 일부 Public 오버로드와 함께 제공 할 때 유용 할 수 있습니다.

+0

나타내는 것을 업데이 트했습니다 네, 평소처럼, 나는 MustOverride 메소드를 포함하기 위해 추상 클래스가 필요하다는 것을 알게 된 후 즉시 깨달았습니다. MustInherit 키워드를 제거하지 않으면 명확히하기 위해 아래를 수행 할 수 없습니까? 공공의 MustInherit MyBaseClass 개인 서브 뉴() 종료 하위 MyBaseClass 으로 보호 기능 때 CreateInstance (PARMLIST) PARMLIST 확인의 경우, 반환 새로운 MyBaseClass() 최종 기능 엉망 최종 클래스 – Jules

+0

, 나는 OP에 위를 추가했습니다! – Jules

+0

Jules : 네 이해가 정확합니다. –

0

클래스에 보호 된 생성자 만있는 경우에는 자체적으로 사용할 수있는 클래스의 인스턴스를 가질 수 있습니다. 리플렉션을 사용하는 것과 같이 보호 된 생성자를 사용하여 작업해야합니다.

클래스가 MustInherit로 표시된 경우 해당 클래스의 인스턴스를 자체적으로 가질 수 없습니다. 파생/상속 된 클래스에 대해서만 인스턴스를 만들 수 있습니다.

0

정말로 원하는 것은 확실하지 않습니다. 당신은 추상 클래스의 객체를 생성해야하는 경우

, 내가하는 것이 좋습니다 당신은 당신의 추상 클래스의 private 클래스 구현을 작성하고 CreateInstanceMethod에 반환 : 당신은 몇 가지를 추가 할 경우,

Public MustInherit MyBaseClass 
    Private BaseClassImplementation 
     Inherits MyBaseClass 

     ... 
    End Class 

    Public Function CreateInstance(paramList) as MyBaseClass 
     If paramList Is Ok Then Return New BaseClassImplementation 
    End Function 
End Class 

그러나 제약 조건을 적용하려면 예외를 throw하는 것이 좋습니다.