디자인 패턴을 알고있는 것처럼 느껴진다. 그러나 이것은 나를 벗어나고있다. 저는 두 개의 개별 프로젝트를 가지고 있습니다. 하나는 다른 프로젝트를위한 라이브러리입니다. 라이브러리는 XML 파일을 읽고 데이터 구조로 파싱합니다. 이것은 XML과의 변환을 책임지는 것을 의미합니다. 내 다른 프로젝트는 라이브러리가 조립하는 데이터에 작용하는 엔진입니다. 아마도 라이브러리에있는 것들을 반영하는 클래스를 포함 할 것이지만, 비헤이비어 메소드를 포함 할 것입니다. 궁금한 점이 있다면, 엔진과 라이브러리를 분리하는 이유는 XML 데이터를 수정하는 에디터 인 세 번째 프로젝트가 있기 때문입니다. 그것은 게임이다.설명과 구현 사이의 개체 추상화
이제 엔진에서 실행할 수있는 명령 세트와 많은 다른 명령을 포함하는 오브젝트를 나타내는 클래스를 라이브러리에 작성합니다. 내 문제는 이러한 명령을 정의하는 좋은 패턴과이를 추상화하는 컨테이너를 찾아 낼 수 없기 때문에 엔진이 유형을 전환 할 필요가 없다는 것입니다. 여기에 두 개의 프로젝트가 없다면, 그것은 쉽습니다. 다른 명령은 Execute()
메서드 또는 그 종류의 것을 포함하는 인터페이스를 구현합니다. 그러나 여기서는 효과가 없을 것입니다. 라이브러리에는 명령 동작을 구현하는 기능이 없으며 XML에서 가져온 특성 만 구현할 수 있습니다.
XML 데이터를로드하고 저장하는 메소드가 들어있는 컨테이너에서 사용할 수있는 인터페이스를 라이브러리에서 만들 수 있습니다. 그러나 엔진은 아직까지 중 하나를 위해 명령에 switch
해야합니다 :
- 실행 그에 따라 자신의 상태를 수정하는 엔진의 컨테이너 클래스의 메소드, 또는
- 는 제어 엔진 개체의 정확한 유형을 생성 명령의 동작을 확인한 다음 인터페이스를 통해 명령을 실행하십시오.
해당 컨테이너는 내 게임의 컷씬과 그 안에있는 키 프레임입니다. 등 음악, 이미지, 텍스트, 여기에
등의 동작을 제어 할 명령은, 라이브러리에서 몇 가지 예제 코드입니다 :
public class SceneInfo
{
/* Other stuff... */
public List<KeyFrameInfo> KeyFrames { get; private set; }
}
public class KeyFrameInfo
{
public List<IKeyFrameCommandInfo> Commands { get; private set; }
}
public class KeyFramePlayCommandInfo : IKeyFrameCommandInfo
{
public int Track { get; set; }
public static KeyFramePlayCommandInfo FromXml(XElement node)
{
var info = new KeyFramePlayCommandInfo();
info.Track = node.GetInteger("track");
return info;
}
public void Save(XmlTextWriter writer)
{
writer.WriteStartElement("PlayMusic");
writer.WriteAttributeString("track", Track.ToString());
writer.WriteEndElement();
}
}
나는 아직 엔진의 절반을 작성하지 않은,하지만 것 keyframe.Commands
에 액세스하고이를 반복하여 수행 할 수 있습니다. 이 문제를 과도하게 설계하지 않고 유형 전환을 피하려고합니다. KeyFramePlayCommand
과 같은 클래스가있을 수 있습니다 (KeyFramePlayCommandInfo
과 비교).
이 문제를 해결하는 좋은 패턴이 있습니까?
게시 IKeyFrameCommandInfo :) –
Save 메서드 만 있지만 실제로는 관련이 없습니다. 답변을 위해 수정해야하는 경우 그렇게하십시오. – Tesserex