Если вам нужен доступ к свойству из базового класса, вы делаете что-то не так. Имейте это в виду для ваших будущих проектов.
Вы должны объявить FileStorage
в базовом классе, так как он есть у обоих унаследованных классов.
Если вы не хотите определять конкретный тип FileStorage
(скажем, byte[]
), вы можете определить его как более общий тип, например IEnumerable<byte>
. В качестве альтернативы вы можете объявить FileStorage
как интерфейс, который обеспечивает любое поведение, к которому вам нужно обращаться из базового класса.
Обновление
Замечательное замечание @ghimireniraj: вы также должны попытаться извлечь ClientEngine из IEngineEntity. Одним из основных моментов проектирования ОО является то, что если вы реплицируете поведение во всех унаследованных классах, оно должно быть в базовом классе.
Но вы действительно хотите получить доступ к некоторому коду из базового класса? Ты не должен. Но если вам действительно нужно, вы всегда можете разыграть:
public abstract class ClientEngine
{
public void SaveFile(string fileName);
{
byte[] fileStorage = null;
if (this is MyEntity1)
{
MyEntity1 me1 = (MyEntity1)this;
fileStorage = me1.FileStorage;
}
else if (this is MyEntity2)
{
MyEntity2 me2 = (MyEntity2)this;
fileStorage = me2.FileStorage;
}
if (fileStorage != null))
File.WriteAllBytes(fileName, fileStorage);
}
}
Противно, верно? Но это должно выглядеть грязно, потому что мы пытаемся сломать ОО дизайн.
Update
Другой путь идет по предложению Марка Гравелла. Вместо приведения к типам приведите к интерфейсу. Но все это по-прежнему плохо пахнет для меня: я твердо верю, что вы можете улучшить свой дизайн.