Up casting - С#
public class a{
public string x1 {get;set;}
public string x2 {get;set;}
public string x3 {get;set;}
}
public class b:a{
}
Очевидно, что var foo = (b)new a();
будет бросать ошибку кастинга во время выполнения.
Единственный другой способ, который я могу представить, чтобы назначить все свойства уже созданного и заполненного a
, состоит в том, чтобы вручную скопировать каждый из них в новый экземпляр b
.
Правильно ли это?
Ответы
Ответ 1
Этот тип приведения неправильный, потому что вы не можете отдать родителей своим детям.
Тип a
не знает о метаинформации типа b
. Поэтому вам нужно предоставить явный оператор литья, чтобы делать такие вещи, , но в этом случае вы должны удалить наследование.
Другой вариант - определить какой-то интерфейс, например, в других вопросах.
Дополнительная информация:
http://msdn.microsoft.com/en-us/library/ms173105.aspx
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
Ответ 2
Невозможно. Даже если вы думаете, что у вас есть это, компилятор будет жаловаться.
Это обычно указывает на конструкцию или логическую ошибку.
Ответ 3
Это то, что меня всегда беспокоило.
Я разработал решение для этого, создав свою собственную утилиту Up-Casting.
Здесь вы можете прочитать мою статью о том, как это сделать - на самом деле это довольно просто.
http://sympletech.com/c-up-casting-utility/
Ответ 4
То, что вы на самом деле ищете, на самом деле является DOWNCAST, а не upcast. Для этого предположим, что у вас есть объект класса a say ObjA. Теперь, чтобы создать объект ObjNewA, сделайте следующее:
b new_ObjNewA = ObjA as b;
приведенный выше код должен работать на 100%
Подумайте об этом следующим образом: ClassName NewObject = OldObject как ClassName;
где имя класса - унаследованный класс или дочерний класс. Вот скриншот, чтобы убедиться, что он работает:
![enter image description here]()
Ответ 5
Вы не можете сделать это.
Вы можете, и я думаю, вы должны использовать интерфейс.
public interface ia
{
string x1 { get; set; }
string x2 { get; set; }
string x3 { get; set; }
}
public class a : ia
{
public string x1 { get; set; }
public string x2 { get; set; }
public string x3 { get; set; }
}
public class b : a, ia
{
}
Тогда вы можете
ia foo = new a();
Ответ 6
На самом деле, ваша идея создания нового экземпляра b и копирования значений поля ему кажется интересным. использование рефлексии для достижения этого должно хорошо соответствовать счету.
Что-то вроде: итерация по всем полям, их значения сохраняются в и сохраняются в одном поле в b.
Тем не менее, это не "downcasting" - поскольку это означает, что создается совершенно другой объект - в отличие от переинтерпретации значения существующего объекта.
Ответ 7
Как говорят все, это невозможно. Неявное кастинг - это одно решение, но я предпочитаю создавать конструктор на b, который принимает экземпляр типа a...
Таким образом, вы можете: удерживать ссылку на внутреннюю часть и делегировать ей вызов b наследует от a или просто просто копировать значения из типа a.