Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData().
У метода SaveData() в унаследованных классах могут быть разные типы аргументов.
Как правильно объявить его в CDataManip?
Здравствуйте, XM, Вы писали:
XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData(). XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов. XM>Как правильно объявить его в CDataManip?
Может быть, просто не объявлять его в базовом классе?
Здравствуйте, XM, Вы писали:
XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData(). XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов. XM>Как правильно объявить его в CDataManip?
Либо сделать тип аргументов абстрактного метода наиболее общим, например:
abstract class Base
{
protected abstract Method(object val1, object val2);
}
// Вариант 1class Derived1 : Base
{
protected override Method(object val1, object val2) {
Method((int)val1, (string)val2); // Либо так…
}
public Method(int val1, string val2) {
// Реализация…
}
}
// Вариант 2class 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.
XM>Есть один базовый класс CDbManipulations, от него унаследован абстрактный класс CDataManip, где требуется определить метод SaveData(). XM>У метода SaveData() в унаследованных классах могут быть разные типы аргументов. XM>Как правильно объявить его в CDataManip?
Здравствуйте, 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) { }
}
Здравствуйте, Каспер, Вы писали:
К>Здравствуйте, 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 вполне нормальное решение?
Три великие достоинства программиста: лень, нетерпение, надменность... Л. Уолл
Здравствуйте, eag, Вы писали:
eag>Зачем такие заморочки? Помоему то что предложил Morpheus вполне нормальное решение?
Во-первых, прошу прощения, так получилось, что вопрос я прочитал, а то, что уже есть ответы не заметил. Во-вторых, решение Morpheusа позволяет только один аргумент, а может, нужно для разных вариантов метода разное число аргументов?
Здравствуйте, Каспер, Вы писали:
К>Здравствуйте, 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. Кстати, в дотнете не принято классы буквой С префиксировать