2012-05-25 2 views
2

Java OOP에서 작업 한 이후로 꽤 오래되었으므로 조금 녹슬었고 설명이 필요했습니다.C# 함수에 수퍼 클래스 전달 (Java 오버추어 사용)

자바에서는 올바르게 기억하면 수퍼 클래스를 선언하고 서브 클래스를 인스턴스화 할 수 있습니다. 예 : Superclass myObject = new Subclass().

그런 다음 myObject를 Superclass 매개 변수를 허용하는 함수로 전달하고 참조를 사용하여 모든 Superclass 특성/메소드에 액세스 할 수 있습니다.

Submitted-specific methods/variables에 접근하고 싶다면 myObject (Superclass로 선언 된)로 직접 할 수 있습니까? 아니면 Subclass 유형으로 변환해야합니까?

이제 C#으로 롤 오버하면 같은 논리가 적용됩니까? 이 동작을 복제하려고하는 이상한 문제가 발생했습니다. 내가 찾고 있어요 특정 사용 사례가 : 나뿐만 아니라 튜토리얼에서이 물건을 찾고 있지만있어

//These are just declarations for ease-of-reading 
Superclass bar = new Subclass(); 
public static void doSomething(Superclass foo) {...} 

//Logic 
doSomething(bar); 
bar.superOnly() //Should this work? 
bar.subOnly() //Should this work? 
bar.subOverrided() //Will this call the superclass or subclass version? 

대부분의 예제는 간단한 것 같다 "서브 클래스 인 myObject = 새로운 서브 클래스()"사소한 출력 인스턴스 . 지금까지 함수 매개 변수의 불투명 한 세계를 다루지는 못했습니다.

누구든지 나를 도울 수 있거나 C#에서 함수 매개 변수와 OO를 다루는 특정 리소스를 가리킨다면 크게 감사하겠습니다.

+1

매개 변수와 관련하여 다음 기사를 읽어 보시기 바랍니다. http://www.yoda.arachsys.com/csharp/parameters.html –

답변

3
내에서 선언 (부모 클래스/인터페이스 공유) 공개 모든 모든 것을 나에게 액세스 할 수 있습니다

여기에 어떤 것이 안개가납니다 - Subclass에 특정한 메소드/변수에 액세스하려면 myObject (수퍼 클래스로 선언 됨)를 사용하여 직접 할 수 있습니까? 아니면이 클래스를 먼저 캐스팅해야합니까? 서브 클래스 형?

네, 그게 다형성입니다. 파생 클래스에서 재정의 된 기본 클래스의 가상 메서드는 기본 형식의 참조를 통해 메서드를 호출하더라도 항상 호출됩니다.

이제 C#으로 롤백하면 동일한 논리가 적용됩니까?귀하의 예로서

예, 원칙은 동일

:

bar.superOnly() //Should this work? 

bar.subOnly() //Should this work? 

아니, 컴파일러는이 방법

에 대해 알고하지 않기 때문에
bar.subOverrided() // Will this call the superclass or subclass version? => the subclass 

예, 당신이 만 서브 클래스에 선언 된 메소드를 호출 할 경우 다형성

+0

기본 클래스의 재정의 된 메서드가 아닌 하위 클래스에 특정한 메서드에 액세스해야하는 경우 어떻게해야합니까? – sichinumi

+1

@ TheDramaLlama, 그렇다면 하위 클래스에 대한 참조가 필요합니다. 컴파일러는 메소드를 정적으로 알아야합니다. 'subOnly'는'Subclass'에서만 선언되기 때문에 수퍼 클래스 –

+0

Gotcha의 변수에서 호출 할 수 없습니다. Woot4Moo의 제안에 따라, 아마 아마도 내 애플 리케이션의 아키텍쳐를 변경하게 될 것이므로 조금 다루기 힘들다. (예를 들어, 10 개 이상의 서브 클래스를 추가해야한다면 확장 할 수 없다. – sichinumi

3

원하는 기능을 얻는 두 가지 방법.

1) 객체를 서브 클래스에 캐스트
2) 객체를 처음부터 서브 클래스로 인스턴스화합니다.

ArrayList이 무엇인지 모르는 Collection이 있으면 번호 1에 대해 ArrayList 메서드를 호출 할 수 없습니다. 두 번째에 대한

Collection collection = new ArrayList(); 

예 :

ArrayList list = new ArrayList(); 

위의 ArrayList

+0

여러 가지 유형을 전달하려고하므로 첫 번째 옵션을 사용해야합니다. 객체를 단일 함수로 변환합니다. "Superclass myClass"를 전달한 후 하위 클래스 별 속성에 액세스 할 수있는 유일한 방법은 "(Class) myClass"를 사용하여 함수 내에서 변환하는 것입니다. – sichinumi

+0

@thedramallama 예. 객체의 유형을 확인하거나 프로그램 아키텍처를 심각하게 재검토해야합니다. – Woot4Moo

+0

Gotcha. 이것은 시간 틀 제한으로 인해 지저분한 중간 디버그 버전에서 사용되고 있습니다. 결국이 모든 것이 훨씬 더 우아해질 것입니다. :) – sichinumi

2

덕분에, 당신은 서브 클래스에 변수를 캐스트 또는 서브 클래스 유형의 변수로 시작해야합니다.

서브 클래스에서 재정의 된 메서드를 호출하려면 수퍼 클래스 변수를 통해 호출하고 하위 클래스의 버전이 호출됩니다.

+0

Gotcha. 이것은 정확히 제가 알고 싶었던 것입니다, 감사합니다! – sichinumi

2

C#과 Java에서 모두 규칙이 매우 일관됩니다.

은 사용자가 사용할 수있는 인터페이스를 지정하는 특정 유형의 변수를 선언합니다. 선언 된 유형은 변수 앞에있는 유형 이름입니다. 선언 된 형식의 일부로 정의 된 메서드 만 사용할 수 있습니다 (캐스팅하지 않고).

대조적으로 정의은 선언 된 유형이거나 선언 된 유형의 하위 클래스 또는 구현 일 수 있습니다. 정의는 해당 변수를 통해 사용할 수있는 인터페이스를 변경하지 않으며, 해당 변수의 구현을 정의합니다. 객체 변수의 정의는 오른쪽에 할당 된 값이며 보통은 new입니다.

변수의 선언 된 유형은 다른 유형으로 캐스팅하여 변경할 수 있습니다. 성공할 수도 있고 그렇지 않을 수도 있습니다. 컴파일러는 캐스트가 유효한지 여부를 반드시 알 필요가 없습니다.

+0

감사합니다! 이것은 방금 나에게 다시 돌진하는 모든 것을 가져왔다. 이것은 학계에서 느슨하게 입력 된 Python을 사용하는 데 너무 많은 시간을 소비하여 망가질 때 일어납니다. :) – sichinumi

관련 문제