Post List

2018/01/16

C#__6.0_응용 템플릿(Template)과 Where

템플릿과 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 인터페이스 접근에 에러가 나게 됩니다.




참고 사이트