Унаследовать класс, но он обычно создается статическим методом? - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть класс, который я хотел бы унаследовать. т.е. ExpenseForm должен наследоваться от Spreadsheet. Электронная таблица предоставлена ​​третьей стороной: я не могу ее изменить.

Но экземпляры родительского класса обычно генерируются статическим методом:

Spreadsheet myExpenses = Spreadsheet.Open(filename);

(И Spreadsheet реализует iDisposable, так что вышеприведенный оператор находится на самом верху раздела использования, но я не думаю, что это действительно влияет на это.)

Я бы хотел иметь

ExpenseForm myExpenses = ExpenseForm.Open(filename);

Конечно, это не получается, поскольку ExpenseForm.Open (унаследованный от Spreadsheet) возвращает объект Spreadsheet.

Какой лучший способ решить это? Может быть, методы расширения? (У меня нет опыта работы с ними.)

Я пошел в другом направлении; ExpenseForm теперь имеет экземпляр Spreadsheet. (Это кажется немного запутанным, так как я должен следить за моими одноразовыми предметами, чтобы убрать, когда я закончу.) Но, похоже, мне не хватает способа решить исходную проблему наследования.

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

Итак, вы можете достаточно легко создать свой собственный метод ExpenseForm.Open:

public static new ExpenseForm Open(string file)
{
    // Do whatever you need
}

Это предполагает, что вы можете создать подкласс, то есть есть подходящие конструкторы, с которыми вы можете связать цепочки.Вы говорите, что вы бы обычно использовали бы Spreadsheet.Open, но есть ли защищенные или общедоступные конструкторы?

Лично я бы предпочел композиционный маршрут в любом случае - вына самом деле хотите, чтобы другой код обрабатывал ExpenseForm, как если бы это был какой-то другой Spreadsheet?Я, как правило, больше фанат композиции, чем наследования - по моему опыту код легче рассуждать.

1 голос
/ 22 сентября 2011

Если Spreadsheet объекты могут быть созданы только с помощью статической функции, то наследование не является опцией.Просто предоставьте собственную Open статическую функцию внутри ExpenseForm, которая возвращает объект такого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...