2011-11-06 2 views
0

나는 며칠 전에 개념이나 상속과 용기를 친구에게 설명하고 있었다.왜 Object [] 배열을 사용하는 것은 나쁜 생각입니까?

그는 프로그래밍 지식이 거의 없으므로 친절한 채팅이었습니다. 대화 중에 그는 대답 할 수없는 질문으로 저에게 왔습니다.

은 "왜 당신은 최상위 클래스의 배열을 가지고 있고, 아무것도 추가하지 못할 것이"

나는이 훨씬 똑똑한 사람이 아니라 내 인생 그래서 전에 말했다되는 한 나쁜 생각을 알고 나는 이유를 기억할 수 없었다.

나는 상속을 통해 항상 그렇게한다는 것을 의미합니다.

고양이와 강아지의 부모 인 계급 동물이 있다고합니다. 이 두 컨테이너를 필요로한다면 우리는 동물 타입의 배열을 만듭니다.

그래서 상속 링크가 없다고 가정 해 봅시다. 기본 객체 클래스를 사용하고 하나의 컨테이너에 모든 것을 포함 할 수는 없습니다.


특정 프로그래밍 언어가 존재하지 않습니다.

+2

어떤 언어입니까? – JaredPar

+1

반드시 "나쁜"것은 아닙니다 (Java와 같은 언어를 가정 함). 그러나 더 나은 접근법이있을 수 있습니다 - 주어진 언어/문제에 대해 "더 나은"일반적으로 더 잘 형식화 된 것을 의미합니다. 지적했듯이'AnimalInterface []'또는'Animal []'이 더 좋을 수도 있지만 이것은'Object' 전에 타입을 통일하는 것이 가능할 때만 작동합니다. –

답변

2

구문 상으로는 문제가 없습니다. 특정 유형의 배열을 선언하면 해당 배열의 내용에 대한 암시 적 정보가 제공됩니다. Object 인스턴스의 포함을 선언 할 수도 있지만 컴파일시 원래 클래스의 모든 유형 정보를 잃어버린다는 의미입니다.

또한 런타임에 배열에서 객체를 가져올 때마다 존재하는 유일한 필드 인스턴스 및 메서드는 필드/메소드 Object (컴파일 타임 문제 일 것임)입니다. 개체의보다 구체적인 하위 클래스의 필드 및 메서드를 사용하려면 캐스팅해야합니다.

또는 런타임에 특정 클래스를 찾으려면 대다수의 경우 과도하게 사용되는 리플렉션과 같은 기능을 사용해야합니다.

+0

반드시 그런 것은 아니며 RTTI도 잊지 마십시오. – Ryan

0

컨테이너에서 요소를 가져올 때 수행 할 수있는 작업에 대한 보장이 필요합니다. 컨테이너의 모든 요소가 Animal의 인스턴스로 반환되는 경우 (여기서 Dog의 인스턴스가 Animal 인 경우) Animals이 수행 할 수있는 모든 작업을 수행 할 수 있다는 것을 알고 있습니다 (Objects이 수행 할 수있는 것보다 많은 것).).

0

어쩌면 우리는 생물학과 같은 이유로 프로그래밍 할 것입니까? 파충류와 고래는 동물이지만 상당히 다릅니다.

0

상황에 따라 다르지만, 문맥이 없으면 대부분의 (모든 언어가 아닐지라도) 객체 지향 언어가 기본 유형의 배열을 갖고 있어도 괜찮습니다 (즉, 모든 대체 원칙을 따르는 한) 다른 파생 된 유형의 다양한 인스턴스를 포함합니다.

0

대부분의 언어에서는 특정 경우에 개체 배열이 존재합니다. 문제는 사용하고 싶을 때마다 언제 어떤 유형인지 기억하고 캐스팅을 유지해야한다는 것입니다.

또한 오류가 발생하기 쉬운 것은 말할 것도없고, 코드를 매우 끔찍하게 만들거나 연장하는 것이 더 무서운 것입니다.

Plant myplant = new Plant(); 
listOfAnimals.Add(myplant); 

은 목록이 object이면 작동하지만 Animal 인 경우 컴파일 시간 오류가 발생합니다.

+0

Plant 예제를 사용하여 요점을 실제로 볼 수 없습니다 ... 동물 컬렉션에 Plant를 추가하려고하면 오류가 발생하며, 컴파일 시간이 바람직합니다. – Ryan

+1

정확히 내 요점. 당신은 그 오류를 원한다. 객체 배열을 대신 사용하면 런타임에 더 이상 실패하지 않습니다. – Haedrian

관련 문제