Существует ли способ произойти из класса с внутренним конструктором?

Вы можете сделать функцию JavaScript, чтобы сделать это:

$.clearInput = function () {
        $('form').find('input[type=text], input[type=password], input[type=number], input[type=email], textarea').val('');
};

, а затем вы можете вызывать эту функцию каждый раз, когда ваш модал скрыт:

$('#Your_Modal').on('hidden', function () {
        $.clearInput();
});
9
задан will 17 June 2009 в 04:39
поделиться

6 ответов

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

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

Я вижу 3 решения для решения именно этой проблемы

1) Я полагаю, что это новые «динамические» типы .NET 4. Вы должны инкапсулировать экземпляр стороннего класса в свой класс как частный член с ключевым словом dynamic Ваш класс должен быть производным от Dynamic или реализовывать интерфейс IDynamicObject. Вам придется реализовать функции GetMember / SetMember, которые будут перенаправлять все вызовы инкапсулированному экземпляру стороннего класса

Что ж, за C # 4.0 будущее, посмотрим на другие решения:

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

public type MethodName(params)
{
   this.anInstanceOf3rdPartyClass.MethodName(params);
}

3) Вы можете сделать то же, что и 2, но с помощью существующих инструментов отражения, например RedGate .NET Reflector. Это поможет вам перечислить все сигнатуры классов и методов. Затем вставьте все это в Word, и простой макрос VB позволит вам сгенерировать тот же код, что и в 2. Примечание: как только вы не копируете код, а копируете только общедоступные подписи методов, я не думаю, что вы нарушите лицензионное соглашение, но в любом случае стоит перепроверить

0
ответ дан 4 December 2019 в 13:04
поделиться

You ask: "Why limit the ability to subclass?"

Because designing for inheritance is tricky, particularly if you're designing for other developers to inherit from your class. As Josh Bloch says in Effective Java, you should design for inheritance or prohibit it. In my view, unless you have a good reason to design for inheritance, you shouldn't do so speculatively.

Does the class implement an interface which you could also implement (possibly by proxying most calls back to an instance of the original)? There's often no really elegant answer here - and the best solution will depend on the exact situation, including what you're trying to add to the class.

If you're not adding any more state - just convenience methods, effectively - then extension methods may work well for you. But they don't change what data an object is capable of storing, so if you need to add your own specialised data, that won't work.

6
ответ дан 4 December 2019 в 13:04
поделиться

Похоже на идеальное приложение для методов расширения:

Документы метода расширения MSDN

«Методы расширения позволяют вам« добавлять »методы к существующим типам без создания нового производного типа, перекомпиляции или иного изменения исходного типа . Методы расширения - это особый вид статических методов, но они вызываются, как если бы они были методами экземпляра расширенного типа. Для клиентского кода, написанного на C # и Visual Basic, нет очевидной разницы между вызовом метода расширения и методами, которые фактически определены в типе. "

3
ответ дан 4 December 2019 в 13:04
поделиться

If the class has an internal constructor, and there are no public constructors, then that suggests that the designers did not intend for it to be subclassed. In that case, you can use encapsulation, or you can use extension methods.

3
ответ дан 4 December 2019 в 13:04
поделиться

Только если ваш класс находится в той же сборке, что и класс, от которого вы хотите наследовать. Внутренний конструктор ограничивает конкретные реализации абстрактного класса сборкой, определяющей класс. Класс, содержащий внутренний конструктор, не может быть создан вне сборки.

2
ответ дан 4 December 2019 в 13:04
поделиться

В Resharper есть удобная функция для создания делегирующих членов.

Здесь - пример того, что вы можете с ним делать. Это займет пару секунд.

2
ответ дан 4 December 2019 в 13:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: