yepi Ответов: 2

Проблема с литьем в отдельном методе


У меня есть кастинг внутри мехода:
//Description of the background classes. Not relevalnt to the problenm itself.
public class TypeY {....}
public class TypeX : TypeY {....}
public class BaseClass
{
    ...
    TypeY Y;
    ...
}
//End of background.
Public class SomeClass4 : BaseClass
{
    TypeX x;

    public void something()
    {
        ...
        x = y as Typex /* THIS WORKS FINE*/
        ...
    }
}


Чтобы включить модификацию по подклассам я изменил ее на:
<pre lang="c#">
Public class SomeClass4 : BaseClase

{
    TypeX x;

    public void something()
    {
        ...
        setX()
        ...
    }
    public virtual void setX()
    {
        x = y as Typex /* THIS DOES NOT WORK AS EXPECTED IN RUN */
    }

}

после выполнения функции setX() x имеет значение null.
Может ли кто-нибудь понять, почему это происходит?

Что я уже пробовал:

Я проверил выполнение строки в setX отладчиком.
в то время как "y как TypeX" имеет ожидаемое значение, x после выполнения строки равно нулю.

Заранее благодарю за любые объяснения.

Дэн

2 Ответов

Рейтинг:
2

BillWoodruff

Проблема здесь заключается в том, что вы не понимаете надлежащей практики реализации объектно-ориентированного проектирования (ООД). Вам нужно сделать некоторые базовые исследования классов и наследования; и вам нужно научиться думать о том, когда и где использовать глобальный переменные.

Существует связный набор идей ООД, выраженных в аббревиатуре SOLID, и я настоятельно рекомендую вам начать изучать эти идеи [^].

Я могу только догадываться о том, что вы здесь делаете из-за отсутствия конкретики: попробуйте отступить от своего кода и четко сформулировать, что вы пытаетесь сделать.

Попытка использовать "Типекс" в качестве базового типа не имеет смысла ... разве что ...

У меня было несколько студентов, чье мышление и код были такими же запутанными, как у вас; единственное, что я нашел полезным, чтобы помочь им начать склоняться, а не вращать свои колеса, - это "жесткий сброс": остановка кодирования и повторное изучение основ.


BillWoodruff

То, что вы описываете, - это беспорядок: не твердый. Как я уже сказал, вам нужно вернуться и изучить основы ООП.

Рейтинг:
14

OriginalGriff

Начните с отладчика и поставьте точку останова на вызов SetX.
Посмотрите на x и на y - что показывает отладчик, прежде чем вы вызовете метод?
Мы вообще не можем видеть объявление, если y, поэтому мы понятия не имеем, какой это тип или что вы в него вкладываете, когда - и мы не можем запустить ваш код, чтобы мы могли сказать.

На первый взгляд y-это null, или класс, который не является производным от Typex, или что-то / setX переопределяется. Скорее всего, это null, потому что вы еще не присвоили ему значение ... отладчик покажет вам правду.


yepi

Спасибо OriginalGriff за быстрый ответ.
Я проверил отладчик на линии insude setX. до выполнения строки: y не является нулем и не является 'y как TypeX'. После выполнения строки (все еще внутри setX) y и 'y как TypeX' не изменяются, а x равен нулю.
Мистика заключается в том, что точно такая же линия прекрасно работает, когда она находится внутри метода "что-то"

OriginalGriff

Итак, что же отладчик показал вам в y?
Оператор "as" не изменяет y, он возвращает null или новый тип, если это применимо.

yepi

отладчик выдал допустимое значение.
Еще раз обратите внимание, что когда строка находилась внутри функции 'something()' (то есть она была выполнена непосредственно, а не через вызов setX ()), то после ее выполнения x удерживал это допустимое значение y.

yepi

Я упростил исходный случай, который гораздо сложнее. Мой вопрос сводится к следующему: "почему эта одна линия работает при прямом вызове и не работает при вызове через дополнительный вызов?"

yepi

Я упростил исходный случай, который гораздо сложнее. Мой вопрос сводится к следующему: "почему эта одна линия работает, когда вызывается напрямую, и не работает, когда вызывается через один линейный субзвонок?"

OriginalGriff

И на первый взгляд ваше упрощение упускает значительную часть оригинала - возможно, вы переопределили метод SetX и не вызываете базовую версию, мы не можем сказать.
Пробовали ли вы запустить сокращенную версию, посмотреть, что происходит, и добавлять код до тех пор, пока он не перестанет работать?

yepi

Спасибо OriginamGriff, вы действительно помогли. Следуя вашим советам, я сумел разобраться в проблеме. Проблема очень сложна и связана с тем, что обе стороны задания ссылаются на две разные копии базовой сборки. Забота об этом решила проблему. Спасибо снова.

OriginalGriff

Всегда пожалуйста!