Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Позднее связывание






    Традиционная постановка задачи позднего связывания может быть проиллюстрирована на следующем примере. Предположим, имеется программа, позволяющая выполнять обработку каких-либо файлов. Для обработки используются классы, реализующие интерфейс FileProcessor. Список типов обрабатываемых программой файлов и соответствующих им классов-обработчиков постоянно пополняется. Сборки, содержащие новые классы-обработчики, помещаются в отдельную папку, а программа-обработчик файлов должна уметь использовать всё новые и новые классы-обработчики без перекомпиляции.

    Интерфейс класса-обработчика будет иметь единственную функцию, определяющую, может ли данный класс обработать данный файл. Поместим интерфейс в отдельную сборку. На неё будут ссылаться конкретные классы-обработчики.

    Интерфейс-обработчик:

     

    // compile with csc /t: library FileProcessor.cs

    using System;

    namespace FileProc

    { interface IFileProcessor

    { bool IsSupport(string filePath);

    }

    }

     

    Теперь определим пару классов обработчиков. Пусть один из них будет работать с текстовыми файлами, второй – с картинками в формате ВMP. При этом каждый будет реализовывать интерфейс-обработчик, и будет помещён в отдельную сборку, ссылающуюся на сборку с интерфейсом.

    Обработчик текстовых файлов:

     

    // compile with csc /t: library TextProcessor.cs /r: FileProcessor.cs

    using System;

    using FileProc;

    namespace TextProcessor

    { public class TextProcessor: IFileProcessor

    { override public bool IsSupport(string filePath)

    { return ".txt" == IO.Path.GetExtension(filePath).ToLower();

    }

    }

    }

     

    Обработчик картинок:

     

    // compile with csc /t: library BmpProcessor.cs /r: FileProcessor.cs

    using System;

    using FileProc;

    namespace BmpProcessor

    { public class BmpProcessor: IFileProcessor

    { override public bool IsSupport(string filePath)

    { return ".bmp" == IO.Path.GetExtension(filePath).ToLower();

    }

    }

    }

     

    В самом приложении, осуществляющем позднее связывание с классами-обработчиками, просто загружаются все сборки из каталога приложения. Затем запрашиваются все типы из каждой сборки, и среди типов ищутся те, что унаследованы от абстрактного класса-обработчика. После того, как нужный тип найден, создаётся его экземпляр и вызывается метод IsSupport.

     

    // compile with csc LateBind.cs /r: FileProcessor.cs

    using System;

    using System.IO;

    using System.Reflection;

    using FileProc;

     

    namespace LateBind

    { class Class1

    { [STAThread] //Атрибут

    static void Main(string[] args)

    { if(args.Length < 1)

    return;

    string[] files = Directory.GetFiles(

    System.Environment.CurrentDirectory, " *.dll");

    foreach (string file in files)

    { Assembly assembly = Assembly.LoadFrom(file);

    Type[] types = assembly.GetTypes();

    foreach (Type type in types)

    { if (typeof(IFileProcessor).IsAssignableFrom(type)

    & &! type.IsAbstract

    )

    { IFileProcessor processor

    = (IFileProcessor)Activator.CreateInstance(type);

     

    if (processor.IsSupport(args[0]))

    { Console.WriteLine(

    " Assembly {0} can process file {1}."

    , assembly.GetName().Name, args[0]);

    Console.ReadLine();

    return;

    }

    }

    }

    }

    Console.WriteLine(" Can't process file {0}.", args[0]);

    Console.ReadLine();

    }

    }

    }

     

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






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.