Я использую библиотеку, которая генерирует кучу классов для меня.
Все эти классы наследуются от общего базового класса, но этот базовый класс не определяет пару методов, общих для всех подклассов.
Например:
SubClassA : BaseClass{
void Add(ItemA item) {...}
ItemA CreateNewItem() {...}
}
SubClassB: BaseClass{
void Add(ItemB item) {...}
ItemB CreateNewItem() {...}
}
К сожалению, базовый класс не имеет этих методов . Это было бы здорово:
BaseClass{
// these aren't actually here, I'm just showing what's missing:
abstract void Add(ItemBaseClass item); // not present!
abstract ItemBaseClass CreateNewItem(); // not present!
}
Поскольку существует общий базовый класс для моих объектов A + B и общий базовый класс для объектов Item, я надеялся извлечь пользу из чудесного мира полиморфизма.
К сожалению, поскольку общие методы на самом деле отсутствуют в базовом классе, я не могу вызвать их виртуально. например, это было бы идеально:
BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB
ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class
Item.DoSomething();
Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
Очевидно, что приведение в действие сработает, но тогда мне нужно будет знать, какой у меня тип, который сводит на нет преимущества.
Как я могу "вызвать" вызов этих методов? Меня не беспокоит получение объекта, который не реализует метод, который я пытаюсь вызвать. Я действительно могу делать то, что я хочу в VB - я не получаю intellisense, но компилятор доволен, и он работает:
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
Агант, я не могу контролировать эти классы (которые, я думаю, исключают частичные классы).