Производные классы как возвращаемое значение - PullRequest
1 голос
/ 07 августа 2010

Учитывая эти классы C # (сгенерированные WCF, Я не могу изменить эти ):

public SysState GetSysState();

public class SysState { /* nothing much here */}
public class Normal : SysState { /* properties & methods */  }
public class Foobar : SysState { /* different properties & methods */  }

Мой код (в настоящее время):

SysState result = GetSysState();

if (result is Normal) HandleNormal((Normal) result);

if (result is Foobar) HandleFoobar((Foobar) result);

Мой вопрос: Я продолжаю чувствовать, что упускаю что-то очевидное, что мне не нужно явно проверять тип.У меня есть старший момент?

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Используйте виртуальный метод.Поместите ваш код в классы, с которыми они работают, а не в некоторый код, который получает ссылку на класс.

public class SysState {
  /* nothing much here, except...: */
  public abstract virtual void DoSomething();
}

public class Normal : SysState {
  /* properties & methods */
  public override void DoSomething()
  {
    // ...
  }
}

public class Foobar : SysState {
  /* different properties & methods */
  public override void DoSomething()
  {
    // ...
  }
}

SysState result = SomeFunctionThatReturnsObjectDerivedFromSysState();

result.DoSomething();

Это выполнит метод DoSomething производного класса.Это называется полиморфизмом и является наиболее естественным (и некоторые утверждают, что единственное правильное ) использование наследования.

Обратите внимание, что SysState.DoSomething не обязательно должен быть абстрактным для этогоработать, но он должен быть виртуальным.

0 голосов
/ 07 августа 2010

Вы можете попробовать объединить handleX и поместить Handle в SysState и переопределить его в Normal и Foobar для выполнения определенных задач. Возможно, это не идеальное решение, но выглядит довольно аккуратно. Если вам нужно ввести данные из других источников, передайте их в качестве параметров?

public class SysState
{
    public bool Process(Information info)
    {
        return ( info.Good );
    }
}

public class Normal
{
    public bool Process(Information info)
    {
        return doStuff();
    }
}

public class Foobar
{
    public bool Process(Information info)
    {
        return diePainfully();
    }
}

Очевидно, это всего лишь пример, не зная, что делают HandleNormal и HandleFoobar, но это может хорошо работать.

...