Вопрос по наследованию в C#
От: XM  
Дата: 15.08.07 07:33
Оценка:
Доброе время суток!

Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().
У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
Как правильно объявить его в CDataManip?

Заранее благодарен за ответ
Re: Вопрос по наследованию в C#
От: nikov США http://www.linkedin.com/in/nikov
Дата: 15.08.07 07:42
Оценка:
Здравствуйте, XM, Вы писали:

XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().

XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
XM>Как правильно объявить его в CDataManip?

Может быть, просто не объявлять его в базовом классе?
Re: Вопрос по наследованию в C#
От: _FRED_ Черногория
Дата: 15.08.07 07:51
Оценка: -1
Здравствуйте, XM, Вы писали:

XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().

XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
XM>Как правильно объявить его в CDataManip?

Либо сделать тип аргументов абстрактного метода наиболее общим, например:
abstract class Base
{
  protected abstract Method(object val1, object val2);
}

// Вариант 1
class Derived1 : Base
{
  protected override Method(object val1, object val2) {
    Method((int)val1, (string)val2); // Либо так…
  }

  public Method(int val1, string val2) {
    // Реализация…
  }
}

// Вариант 2
class Derived2 : Base
{
  protected override Method(object val1, object val2) {
    // Реализация…
  }

  public Method(double val1, short val2) {
    Method((object)val1, (object)val2); // …либо так
  }
}

либо сделать тип аргументов generic:
abstract class Base
{
  protected abstract Method<T1, T2>(T1 val1, T2 val2);
}

class Derived1 : Base
{
  protected override Method<T1, T2>(T1 val1, T2 val2) {
    // Реализация…
  }
}

class Derived2 : Base
{
  protected override Method<T1, T2>(T1 val1, T2 val2) {
    // Реализация…
  }
}

Можно и скомбинировать первый и второй способы. Выбор варианта должен зависеть от того, как легче и "чище" реализовать метод.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: Вопрос по наследованию в C#
От: _Morpheus_  
Дата: 15.08.07 09:11
Оценка: +1
Здравствуйте, XM, Вы писали:


XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().

XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
XM>Как правильно объявить его в CDataManip?

SaveData(object arg)
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re: Вопрос по наследованию в C#
От: Каспер Украина  
Дата: 20.08.07 15:52
Оценка:
Здравствуйте, XM, Вы писали:

XM>Доброе время суток!


XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().

XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
XM>Как правильно объявить его в CDataManip?

XM>Заранее благодарен за ответ


Надо в CDataManip объявить все варианты SaveData() со всеми возможными типами аргументов. Если конкретный SaveData() должен быть реализован во всех неабстрактных потомках, в CDataManip он может быть abstract или virtual, в противном случае — только virtual.

abstract class CDataManip
{
public abstract void SaveData(int param);
public abstract void SaveData(string param);
public virtual void SaveData(int param1, string param2) { }
}
Re[2]: Вопрос по наследованию в C#
От: eag Россия  
Дата: 20.08.07 17:06
Оценка:
Здравствуйте, Каспер, Вы писали:

К>Здравствуйте, XM, Вы писали:


XM>>Доброе время суток!


XM>>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().

XM>>У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
XM>>Как правильно объявить его в CDataManip?

XM>>Заранее благодарен за ответ


К>Надо в CDataManip объявить все варианты SaveData() со всеми возможными типами аргументов. Если конкретный SaveData() должен быть реализован во всех неабстрактных потомках, в CDataManip он может быть abstract или virtual, в противном случае — только virtual.


К>abstract class CDataManip

К>{
К> public abstract void SaveData(int param);
К> public abstract void SaveData(string param);
К> public virtual void SaveData(int param1, string param2) { }
К>}

Зачем такие заморочки? Помоему то что предложил Morpheus вполне нормальное решение?
Три великие достоинства программиста: лень, нетерпение, надменность... Л. Уолл
Re[3]: Вопрос по наследованию в C#
От: Каспер Украина  
Дата: 21.08.07 07:29
Оценка:
Здравствуйте, eag, Вы писали:

eag>Зачем такие заморочки? Помоему то что предложил Morpheus вполне нормальное решение?


Во-первых, прошу прощения, так получилось, что вопрос я прочитал, а то, что уже есть ответы не заметил. Во-вторых, решение Morpheusа позволяет только один аргумент, а может, нужно для разных вариантов метода разное число аргументов?
Re[4]: Вопрос по наследованию в C#
От: b0ba  
Дата: 21.08.07 11:52
Оценка:
Здравствуйте, Каспер, Вы писали:

К>Здравствуйте, eag, Вы писали:


eag>>Зачем такие заморочки? Помоему то что предложил Morpheus вполне нормальное решение?


К>Во-первых, прошу прощения, так получилось, что вопрос я прочитал, а то, что уже есть ответы не заметил. Во-вторых, решение Morpheusа позволяет только один аргумент, а может, нужно для разных вариантов метода разное число аргументов?



Делается все легко и просто:

  public virtual void Execute(params object[] pars)
  {}

где-то в наследнике вы его перекрываете:

  public override void Execute(params object[] pars)
  {
    // используем например так:
    object oldObject = pars.GetValue(1);
  }


а затем вызываете:

DefaultAction.Execute(CurrentDictionary, CurrentDictionary.CurrentObject);
или
DefaultAction.Execute(null)

или как душе угодно.

ps. Кстати, в дотнете не принято классы буквой С префиксировать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.