Как обрабатывать переменную экземпляра как экземпляр другого типа в C # - PullRequest
2 голосов
/ 18 марта 2010

У меня есть простая иерархия наследования с MyType2 наследованием от MyType1.

У меня есть экземпляр MyType1, arg, переданный в качестве аргумента методу. Если arg является экземпляром MyType2, то я хотел бы выполнить некоторую логику, преобразовав экземпляр. Мой код выглядит примерно так, как показано ниже.

Необходимость создания новой локальной переменной b чувствует себя не элегантно - есть ли способ достичь того же поведения без дополнительной локальной переменной?

public MyType1 MyMethod(MyType1 arg) 
{
    if(arg is MyType2)
    {
        MyType2 b = arg as MyType2;
        //use b (which modifies "arg" as "b" is a reference to it)...
    }

    return arg;
}

Ответы [ 3 ]

5 голосов
/ 18 марта 2010

Обратите внимание, что "is" и "as" дублируют тест; либо используйте is, а затем (как только вы знаете) просто разыграйте - или используйте as в первую очередь и проверьте на null.

Ре ваша проблема; если вы хотите сделать только одну вещь, тогда разыграйте:

if(arg is MyType2)
{
    ((MyType2)arg).SomeSpecialMethod();
}

В противном случае - возможно, метод virtual (на базовом типе) или просто преобразовать логику в другой метод, так что вы получите:

if(arg is MyType2)
{
    StuffThatTakesType2((MyType2)arg);
}

Но лично , я бы просто использовал дополнительную переменную:

MyType2 whatever = arg as MyType2;
if(whatever != null) {
    whatever.Foo = 123;
    whatever.Bar();
}
2 голосов
/ 18 марта 2010

Нет; вам нужно создать отдельную переменную.

Кроме того, ваш код выполняет больше приведений, чем необходимо; это было бы немного быстрее, как это:

MyType2 b = arg as MyType2;
if(b != null)
{
    //Use b 
}
1 голос
/ 18 марта 2010

Я бы сказал, что вариант 1 состоит в том, чтобы поместить весь модифицирующий код (строку комментария) как функцию MyType2, а затем выполнить (arg as MyType2).Foo() для него.

Вариант 2 - реализовать MyMethod как для MyType1, так и для переопределения в MyType2, и просто вызывать его, не беспокоясь. Реализация MyType1 может ничего не делать, что не лучший дизайн.

edit: технически не является нарушением LSP, поскольку это применимо только в обратной ситуации (MyType2 не должен нарушать поведение MyType1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...