템플릿과 where문법을 사용했던 내용을 적어보겠습니다. 정작 툴을 만들기 위해 공부했던 내용들인데 막상 구현할때 사용하려니 막히는 부분도 있지만, 예외적인 사항들도 짚고 넘어갈 수 있었습니다.
C/C++ MFC로 만들어진 툴을 C#으로 포팅하면서 C++에서 사용하던 Template을 C#으로 포팅하는 과정입니다.
1
2
3
4
5
6
7
8
|
public abstract class CFileBase
{
// 바이너리 파일 읽기
public abstract void LoadFromFile(ref BinaryReader fileReader);
// 바이너리 파일 쓰기
public abstract void SaveToFile(ref BinaryReader fileReader);
| cs |
CFileBase는 툴에서 파일을 읽고 쓰고할 데이터들의 추상클래스입니다.
추상클래스인 CFileBase의 선언부. CFileBase를 상속받는 클래스는
추상메소드인 LoadFromFile과 SaveToFile의 메소드를 반드시 재정의 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class TypeTable<DataType> : CFileBase where DataType : CFileBase, new()
{
private List<DataType> m_Data = new List<DataType>();
private UInt32 m_Size = 0;
public override void SaveToFile(ref BinaryWriter fileWriter)
{
}
public override void LoadFromFile(ref BinaryReader fileReader)
{
}
| cs |
Where은 DataType의 형식에 대한 제약 조건을 지정하는데 사용됩니다.
위와같이 DataType은 CFileBase의 인터페이스를 구현하도록 TypeTable을 선언할 수 있으며,
그래서 CFileBase의 인터페이스인 LoadFromFile(), SaveToFile을 구현할 수 있습니다.
* 여기서 TypeTable<DataType> : CFileBase 부분은 템플릿 클래스가 CFileBase 클래스의 상속을 의미합니다!
1
2
3
|
for (int k = 0; k < (int)m_Size; ++k)
m_Data[k].SaveToFile(ref fileWriter);
| cs |
그럼 위와 같이 CFileBase의 인터페이스를 사용할 수 있게 됩니다.
1
2
3
4
5
|
public class TypeTable<DataType> : CFileBase // where DataType : CFileBase, new()
{
private List<DataType> m_Data = new List<DataType>();
private UInt32 m_Size = 0;
| cs |
하지만 DataType의 형식에 제약 조건을 두지 않는다면, CFileBase의 인터페이스 접근에 에러가 나게 됩니다.
참고 사이트