4

우선, "또 다른 인터페이스 질문"에 대해 사과드립니다. 나는이 질문이 가치있는 것일지도 모른다고 생각했지만 이상한 문제였다. 내가 사용하고있는 프로젝트는 Actionscript 3을 사용하지만, 이것은 일반적인 OOP 질문에 더 가깝습니다. 여기 동일한 구현 코드를 인터페이스와 재사용하지 않으려면 어떻게해야합니까?

상황입니다 : 이미 기본 클래스에서 상속되는 클래스가

; 그것은 비디오 게임의 대상입니다. (그것이 우주선이라고 가정 해 봅시다.) 제 게임에서는 스크린 상 많은 우주선을 한 번에 가지고 싶기 때문에 링크드 목록 구조를 사용하여 객체 풀을 생성하기로 결정했습니다.

실제로 Spaceship 클래스는 기본 클래스에서 상속 받았기 때문에 인터페이스를 사용하여 연결된 목록과 관련된 메서드를 정의했습니다. 추가적으로이 메소드를 클래스 Asteroid 나 클래스 Bullet 또는 클래스 Particle과 같은 다른 클래스로 확장 할 수 있습니다.

다음은 문제입니다. 인터페이스의 강점은 필요한 것을 기반으로 사용하는 모든 클래스에 대한 구현을 재정의 할 수 있다는 것입니다. 그러나 연결된 목록과 같은 항목의 경우 코드는 클래스간에 변경되지 않습니다. 이러한 객체 풀 메소드를 구현할 많은 클래스를 계획하고 있으므로 새로운 클래스마다 동일한 구현 코드를 반복해서 사용하지 않는 것이 좋습니다.

질문 : 내가 사용하는 각 클래스에 대해 똑같은 연결 목록 코드를 재사용하지 못하도록하는 방법이 있습니까? 아니면 그냥 피할 수없는 것입니까? 이것이 한 번만 한 원칙에 위배되는 것 같습니다. 프로토 타입 대신 상속 블록 내에서 전체 함수를 정의 할 수 있습니까?

어리석은 질문 인 경우 알려주세요. (만약 내가 그 것인지 아닌지 묻는다면 그것은 아마 그렇지만 어쩌면 어리석은 짓을하지 않고서도 배울 수는 없을 것입니다.) 이런 식으로하는 좀 더 논리적 인 방법이있는 것 같습니다.

답변

2

다중 상속을 지원하는 다른 언어에서는 우주선이 기본 선박 클래스뿐만 아니라 연결된 목록 요소를 상속 할 수있는 공통의 조상을 필요로하는 모든 게임 개체가 없으면 쉽게 수행 할 수 있습니다 수업. 불행하게도, AS3는 다중 상속을 지원하지 않습니다, 그래서 당신은 하나에 선택할 수 있습니다

A. 당신이

또는

B. 모든 게임 객체의 기본 클래스에서 상속 되세요 제안 정확히 같은 인터페이스를 사용하여 연결된 목록 기능을 구현하고 Sprite 또는 MovieClip을 직접 확장하는 게임 객체 기본 클래스 대신 Sprite (또는 MovieClip)를 확장하는 공통 조상입니다.

정확한 문제를 해결하기 위해 후자와 함께 갈 것입니다. 아마 Sprite 나 MovieClip에서 파생되어 GamePoolObject 같은 것을 호출 할 것입니다 ...

+0

또한 공통 기본 클래스 방식을 사용하면 인터페이스가 강제로 수행해야하는 여러 구현의 유연성을 잃지 않았습니다. 하위 클래스가 필요한 경우 연결된 목록 비헤비어를 구현하는 함수입니다. 하지만 당신은 아마 그렇게하지 않을 것입니다. 그래서 나는 기본 클래스가 여기의 인터페이스보다 낫다고 생각하는 이유입니다. –

+0

예. 솔직히, 나는이 이유 때문에 다중 상속을 희망했지만 많은 사람들이 그것을 싫어하는 것 같습니다. 나는 그것이 악하다고 생각하지 않는다. 그것은 단지 오해 된 것이다. 저는 실제로 Actionscript의 거대한 상속 나무를 좋아하지 않습니다. 그 필요성을 이해 합니다만, 필요한 몇 가지 방법을 얻기 위해 기본 클래스를 트리에 삽입해야한다는 점이 마음에 들지 않습니다. 그래도 액션 스크립트 3 방식으로 보입니다. –

+0

다른 문제는 Sprite 또는 다른 내장 함수를 확장하면 Flash의 핵심 클래스를 확장 할 필요가없는 클래스가있을 때 어떤 일이 발생합니까? 나는 그 문제에 대해 잠시 숙고하고있었습니다. 전체 클래스의 모든 기능이 필요할 때만 상속 받아야한다고 생각합니다. 기본 구현을 가지고 기본 클래스 * 및 * 풀 인터페이스를 사용하려고 생각했지만 자체적 인 문제 세트 (각 접근 방법의 개별 문제 포함)가있는 것처럼 보입니다. 나는 총알을 물고 옵션 A를 사용해야 할 것 같아요. 당신의 의견을 감사하십시오. –

0

나는 인터페이스를 사용하는 것을 결코 좋아하지 않았습니다.
내가 할 수있는 것은 다른 기본 클래스를 만드는 것입니다.
첫 번째 클래스는 기본 클래스가되어 SpaceObject를 호출 할 수 있습니다. 모든 공간 객체에는 질량, 속도, 마찰 (있는 경우), 회전 속성이 있습니다. SpaceObject는 또한 UIcomponent를 확장하여 표시 목록에 추가하고 히트 감지를위한 상속 된 메서드를 사용하면 좋을 것입니다.
또한 우주 객체에 필요한 이동 및 기타 작업을 처리 할 메소드가 있습니다.
그러면 새로운 공간 객체를 만들고 싶을 때마다 SpaceObject 클래스를 확장합니다.
공용 클래스 SpaceShip이 SpaceObject를 확장하거나
공용 클래스 Commet은 SpaceObject를 확장합니다.
이러한 클래스는 SpaceObjects 특성을 상속하며 꼬리 또는 무기의 길이와 같은 고유 한 특성을가집니다. 그들은 그들과 관련된 모든 것을 다루기 위해 캡슐화되어야합니다

+0

인터페이스는 실제 인터페이스가 필요할 때 사용할 수 있습니다. 예를 들어, 게임 서버와의 통신을 관리하고 IGameServerConnection 인터페이스를 통해 게임 클라이언트에 제공하는 클래스를 만들 수 있습니다. 같은 인터페이스를 구현하지만 서버 응답을 가짜로 만드는 오프라인 테스트 용 더미 서버를 만들 수 있습니다. 나는 이것이이 경우를위한 최선의 해결책이라고 생각하지 않는다. 나는 그것이 당신이 원하는 "기본"클래스의 공통적 인 행동이며, "인터페이스"라는 비명을 지르는 것이 아니라 오히려 다중 상속이라고 비난한다. –

관련 문제