2017-12-19 5 views
0

"상위"개체는 설정된 하위 개체의 "세부 정보"를 유지 관리하는 것으로 보입니다. 이것이 실제로 실제로 일어나기를 원하는 동안 - 이해가 안되요 이 일이 일어나고 있는지, 두렵습니다."부모"개체의 인스턴스가 그 자식 개체의 메서드/속성을 어떻게 사용할 수 있습니까?

새로운 부모 개체가 자식 개체로 설정되면 부모가 아닌 모든 속성/메서드가 손실되거나 액세스 할 수 없게 될 것으로 예상됩니다. 그러나 아래에 설명 된 것처럼 설정 한 것 같습니다. 사실이 아닙니다. 누군가 이런 일이 일어나는 이유를 설명 할 수 있습니까?

(끔찍한 예를 들어 사과)

주어진 다음의 세 가지 클래스 :

Public Class Person 

    Public Property FirstName As String 
    Public Property LastName As String 

    Public Overridable Function WriteStatement() As String 
     Return "[Unknown] " & FirstName & " " & LastName 
    End Function 

End Class 

Public Class Man 

    Inherits Person 
    Public Property gender As String = "Male" 

    Public Overrides Function WriteStatement() As String 
     Return "[" & gender & "] " & FirstName & " " & LastName 
    End Function 

End Class 

Public Class Woman 

    Inherits Person 
    Public Property gender As String = "Female" 

    Public Overrides Function WriteStatement() As String 
     Return "[" & gender & "] " & FirstName & " " & LastName 
    End Function 


End Class 

그리고 다음이 실행 코드 :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

Dim boy As New Man 
Dim girl As New Woman 

boy.FirstName = "Scott" : boy.LastName = "Smith" 

girl.FirstName = "Jane" 
girl.LastName = "Jones" 

Dim people As New List(Of Person) 
Dim malePerson As New Person 
Dim femalePerson As New Person 

malePerson = boy 
femalePerson = girl 

people.Add(malePerson) 
people.Add(femalePerson) 

For Each p As Person In people 
    MsgBox(p.WriteStatement()) 
Next 

'Outputs: 
' [Male] Scott Smith 
' [Female] Jane Jones 
' 
'Expected: 
' [Unknown] Scott Smith 
' [Unknown] Jane Jones 

최종 하위

+0

귀하의 설계는 부모 클래스가 파생 클래스의 세부 사항을 알고 필요로하지해야한다. 중단 점을 설정하고 해당 WriteStatement 문으로 이동하십시오. 'Console.WriteLine (malePerson.GetType())'이 깨달을 수도 있습니다. – Plutonix

답변

1

용어 " 부모 "와"아동 "은이 맥락에서 적절하지 않습니다. 당신이 말하는 것은 기본 유형과 파생 된 유형입니다. 당신은 객체에 객체를 설정하는 것에 대해서 이야기 할 때 틀린 것입니다. 그것은 단지 무의미한 것입니다. 사물이 그 것이다. 변수를 객체에 설정할 수는 있지만 객체가 변경되지는 않습니다. OOP는 실생활을 모방하도록 설계되었습니다. 어떤 사람이있을 것으로 예상되는 사람을 데리고 간다면, 그들은 남자 또는 여자가되는 것을 중단합니까? 아니, 그들은 프로그래밍 개체가 동일하지 않습니다. 유형이 멤버를 재정의 한 경우 해당 유형의 객체에서 해당 멤버를 호출하면 참조 유형이 파생 유형인지 기본 유형인지 여부에 관계없이 파생 구현이 호출됩니다. 이것이 우선 작동 방식입니다.

+0

고맙습니다. 많은 도움이되었습니다. "Base"와 "Derived/Inherited"가 정확하다는 것을 알았지 만, 나는 그것이 다른 곳에서 언급 된 부모/자식과 동의어라고 생각했습니다. – BrINClHOF

0

당신은 부모 클래스에서 이것을 사용한다 :

public MUSTOVERRIDE class person 
Public mustoverride Property gender As String 

와 자식 클래스

:

Public overrides Property gender As String = "Male"