2014-11-01 5 views
2

C# 및 .NET Framework를 사용하여 AutoCAD 2014 용 플러그인을 작성하고 있습니다. 아이디어는 내가 그래서 내가 '방법으로 데이터를 조작 할 수 있습니다 이미 OpeningDataTable의 인스턴스로 도면에서 AutoCAD 도면에 그려진 테이블을 당겨 할 것입니다C#의 하위 클래스에 상위 클래스 캐스팅

public class OpeningDataTable : Autodesk.AutoCAD.DatabaseServices.Table 

: 나는 오토 데스크의 Table 클래스과 같이 확장 썼다. 그래서 같이 그 일을하고있다 :

OpeningDataTable myTable = checkForExistingTable(true); 

public Autodesk.AutoCAD.DatabaseServices.Table checkForExistingTable(bool isWindow) 
     { 
      Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; //Current drawing 
      Transaction tr = doc.TransactionManager.StartTransaction(); 
      DocumentLock docLock = doc.LockDocument(); 
      TypedValue[] tableItem = new TypedValue[] { new TypedValue(0, "ACAD_TABLE") }; 
      SelectionFilter tableSelecFilter = new SelectionFilter(tableItem); 
      Editor ed = doc.Editor; //Editor object to ask user where table goes, subclass of Document 

      using (tr) 
      { 
       PromptSelectionResult selectResult = ed.SelectAll(tableSelecFilter); 
       if (selectResult.Status == PromptStatus.OK) 
       { 
        SelectionSet tableSelSet = selectResult.Value; 
        for (int i = 0; i < tableSelSet.Count; i++) 
        { 
         Autodesk.AutoCAD.DatabaseServices.Table tableToCheck = (Autodesk.AutoCAD.DatabaseServices.Table)tr.GetObject(tableSelSet[i].ObjectId, OpenMode.ForRead); 
         String tableTitle = tableToCheck.Cells[0, 0].Value.ToString(); 
         if(tableTitle.Equals("Window Schedule") && isWindow == true) 
          return (OpeningDataTable)tableToCheck; 
         if (tableTitle.Equals("Door Schedule") && isWindow == false) 
          return (OpeningDataTable)tableToCheck; 
        } 
       } 
       return null; 
      } 
     } 

는 그러나, 나는 내가 OpeningDataTable 개체 (자식 클래스)에 Table 객체 (부모 클래스)를 변환 할 수 없다는 오류가 발생합니다.

이 문제에 대한 간단한 해결 방법이 있습니까?

+1

번호 당신은 A' B''에'캐스팅 수 없습니다를 '또는 B를 상속받은 어떤 것. 여기서 변수의 실제 타입은'Table'이며, 이것을'OpeningDataTable'으로 형변환하려고합니다.'Table'은'OpeningDataTable'을 상속받지 않습니다. – MarcinJuraszek

답변

2

OpeningDataTable에 대해 Table을 매개 변수로 사용하는 생성자를 만들어야합니다. 당신이 OpeningDataTableTable 캐스팅 할 수

이유는 Table 그냥 object 같은 OpeningDataTableint되지되지 않는 것입니다.

+0

좋은 설명, 간단한 설명. – J0e3gan

2

참으로 하위 클래스의 개체에 대한 참조가 아닌 경우 그런 개체에 대한 참조를 다운 캐스트 할 수 없습니다. 그래서 내리 뜬 작품 : fooToo는 단순히 ObjectString를 참조하기 때문에 예를 들어, 다음은 ...

string foo = "Yup!"; 
object fooToo = foo; 
string fooey = fooToo as string; 

Console.WriteLine(fooey); // prints Yup! 

괜찮습니다.

Decorator design pattern를 사용하고 Table 인수 받아 OpeningDataTable에 생성자 추가 고려 : A``의 실제 유형`B가 아닌

public class OpeningDataTable : Autodesk.AutoCAD.DatabaseServices.Table 
{ 
    private Table _table; // the decorated Table 

    public OpeningDataTable(Table table) 
    { 
     _table = table; 
    } 

    // <your methods for working with the decorated Table> 
}