2014-11-01 3 views
2

Я пишу плагин для AutoCAD 2014 с использованием C# и .NET Framework. Я продлил Table класса компании Autodesk, как так:Кастинг родительского класса для дочернего класса в C#

public class OpeningDataTable : Autodesk.AutoCAD.DatabaseServices.Table 

Идея заключается в том, что я хочу, чтобы вытащить таблицу уже нарисованную на AutoCAD рисунка из чертежа в качестве экземпляра OpeningDataTable таким образом я могу манипулировать данные с методами I» я написал. Я делаю это так:

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; 
      } 
     } 

Однако я получаю ошибку о том, что я не могу преобразовать Table объект (родительский класс) к OpeningDataTable объекта (класс ребенка).

Есть ли обходной путь для этой проблемы?

+1

Нет, вы не можете бросить 'a' в' b', если фактический тип 'Ā' не' B 'или что-то, что наследует' B'. Здесь фактическим типом вашей переменной является «Таблица», и вы пытаетесь передать ее в «OpeningDataTable», где «Таблица» не наследует 'OpeningDataTable'. – MarcinJuraszek

ответ

2

Вам необходимо будет создать конструктор для OpeningDataTable, который принимает в качестве параметра Table.

Причина, по которой вы не можете бросить Table к OpeningDataTable является то, что Table не является OpeningDataTable так же, как object не является int.

+0

Хорошо, простое объяснение. – J0e3gan

2

Вы не можете опускать ссылку на такой объект, если только это не ссылка на объект дочернего класса. Например, следующий штраф ...

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

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

... потому что fooToo просто ссылается на String как Object: так потупленные работы.

Рассмотрите возможность использования Decorator design pattern и добавление конструктора к OpeningDataTable, который принимает Table ARG:

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> 
}