Во-первых, зачем вам делать такие странные актеры?Вероятно, есть другой дизайн того, что вы пытаетесь сделать.
Во-вторых, причина, по которой вы не можете выполнять приведение, состоит в том, что RawRow не HeaderRow.Единственная гарантия, которую он дает, состоит в том, что он реализует IHeaderRow
.Проблема в том, что у него тоже есть куча других вещей, которых нет у HeaderRow
.И наоборот - HeaderRow
, вероятно, имеет кучу вещей, которых нет у ObjectRawRow
.
Представьте, что ваши классы выглядят так:
interface IHeaderRow
{
string GetText();
}
class HeaderRow : IHeaderRow
{
public string GetText()
{
return "My Label";
}
public int GetFoo()
{
return 42;
}
}
class ObjectRawRow : IHeaderRow
{
public string GetText()
{
return "My Raw Label";
}
}
Теперь, если вы это сделаете,все в порядке:
ObjectRawRow row = new ObjectRawRow();
IHeaderRow header = row as IHeaderRow;
string label = header.GetText(); // fine, since GetText is guaranteed to exist
Но примерьте это для размера:
ObjectRawRow row = new ObjectRawRow();
HeaderRow header = row as HeaderRow;
int magic = header.GetFoo(); // BOOM! Method doesn't exist,
// because the object isn't really a HeaderRow under the covers.
// It's still really an ObjectRawRow. What do you do now? Crash hard is what.
И вот почему вы не можете разыгрывать вне дерева наследования.