C# совместно используют код между классами

Для управления версиями существует несколько вещей, которые можно использовать, в зависимости от какой системы управления версиями Вы используете. Но часть функциональности характерна для всех них.

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

самая полезная команда C-x v v (vc-next-action), который делает соответствующее следующее действие для файла, который Вы посещаете. Это могло бы означать обновлять из репозитория или фиксировать Ваши изменения, vc.el также снова переплетает C-x C-q для регистрации и файлы, если Вы используете систему, которой нужен он (как RCS).

Другие очень полезные команды C-x v l и C-x v = , которые показывают Вам журнал и текущую разность для файла, который Вы используете.

, Но для реальной производительности, необходимо избегать использования однофайловых команд vc.el кроме для простых вещей. Существует несколько пакетов, которые могут дать Вам обзор состояния Вашего целого дерева, и давать Вам больше питания, и не говоря уже о способности создать когерентные фиксации, охватывающие несколько файлов.

на Большинство из них в большой степени влияют или на основе оригинала pcl-cvs / pcvs для CVS. Существует даже два из них, который идет с подрывной деятельностью, psvn.el и dsvn.el. Существуют пакеты для мерзавца и т.д.

5
задан mson 10 December 2009 в 03:42
поделиться

10 ответов

Если у вас есть функциональные возможности, которые вы часто используете в классах, представляющих очень разные вещи, по моему опыту, они должны быть разделены всего на несколько категорий:

  • Утилиты (например, форматирование строк, синтаксический анализ,. ..)
  • Общие проблемы (ведение журнала, обеспечение безопасности, ...)

Для функциональности служебного типа вам следует рассмотреть возможность создания отдельных классов и ссылки на служебные классы, где это необходимо, в бизнес-классе.

public class Validator
{
  public bool IsValidName(string name);
}

class Patient
{
  private Validator validator = new Validator();
  public string FirstName
  {
     set
     {
         if (validator.IsValidName(value)) ... else ...
     }
  }
}

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

Что касается примера PrintA и PrintB, обсуждаемого в других комментариях, он звучит как отличный случай для Factory Pattern. Вы определяете интерфейс, например IPrint, классы PrintA и PrintB, которые реализуют IPrint, и назначить экземпляр IPrint в зависимости от того, что нужно конкретной странице.

// Simplified example to explain:

public interface IPrint 
{ 
   public void Print(string); 
}

public class PrintA : IPrint
{
   public void Print(string input)
   { ... format as desired for A ... }
}

public class PrintB : IPrint
{
   public void Print(string input)
   { ... format as desired for B ... }
}

class MyPage
{
   IPrint printer;

   public class MyPage(bool usePrintA)
   {
      if (usePrintA) printer = new PrintA(); else printer = new PrintB();
   }

   public PrintThePage()
   {
      printer.Print(thePageText);
   }
}
7
ответ дан 18 December 2019 в 07:09
поделиться

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

Вы могли, однако, определить интерфейс и объявить методы расширения для этого интерфейса . Затем интерфейс может быть реализован вашими классами, и вы можете вызывать методы расширения для этих классов. Например,

public interface IShareFunctionality { }

public static class Extensions
{
    public static bool DoSomething(this IShareFunctionality input)
    {
        return input == null;
    }
}

public class MyClass : Object, IShareFunctionality
{
    public void SomeMethod()
    {
        if(this.DoSomething())
            throw new Exception("Impossible!");
    }
}

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

Нам могут потребоваться более конкретные примеры что ты хочешь сделать?

4
ответ дан 18 December 2019 в 07:09
поделиться

Методы расширения Checkout: http://msdn.microsoft.com/en-us/library/bb383977.aspx

2
ответ дан 18 December 2019 в 07:09
поделиться

Подойдет служебный класс AC #. Он действует как центральный реестр для общего кода (или как конструкция модуля VB.NET) - он должен содержать код, не относящийся к какому-либо классу, в противном случае он должен был быть присоединен к соответствующему классу.

Вы не хотите начинать копировать исходный код, если вам это не нужно, потому что это приведет к проблемам с обновлением кода, учитывая дублирование .

Пока источнику не нужно сохранять состояние, используйте статический класс со статическим методом.

static public class MySharedMembers {
    static public string ConvertToInvariantCase(string str)  {
        //...logic
    }
    // .... other members
}
3
ответ дан 18 December 2019 в 07:09
поделиться

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

Если они не находятся в одном пространстве имен, добавьте пространство имен классов, которые вы хотите использовать, в директивах использования, и оно должно работать так же, как указано выше.

Меня смущает вопрос: похоже, вам нужно поработать над базовым пониманием объектно-ориентированного подхода.

2
ответ дан 18 December 2019 в 07:09
поделиться

Я не знаю способа включить части файлов, но мы часто делаем то, что добавляем существующий файл и "связываем" его из текущего местоположения. Например, у нас есть файл assemblyInfo.cs, на который каждый проект ссылается из каталога решения. Мы меняем его один раз, и все проекты имеют одинаковую информацию, потому что они ссылаются на один и тот же файл.

В противном случае предложения по рефакторингу «общих» подпрограмм в common.dll - лучшее, что я придумал в .Net.

2
ответ дан 18 December 2019 в 07:09
поделиться

I я уже не совсем уверен, что вы подразумеваете под «осмысленной» структурой, но это похоже на место, где вы могли бы использовать реализацию базового класса. Хотя это и не так "многословно", как множественное наследование в C ++, вы можете получить некоторую выгоду от использования связанной реализации базового класса для повторного использования общих функций.

Вы можете сохранить иерархию классов, по крайней мере, визуально, и при необходимости переопределить поведение.

1
ответ дан 18 December 2019 в 07:09
поделиться

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

Например, создайте «PrintingService», который содержит логику, необходимую для печати. После этого у вас могут быть классы, которые необходимо распечатать, и они будут зависеть от этой службы (либо через конструктор, либо через параметр в методе, которому требуется служба).

Еще один совет, который у меня есть в этих строках, - это создание интерфейсов для базовой функциональности а затем использовать интерфейсы для кодирования. Например, у меня была куча классов отчетов, которые пользователь мог либо отправить по факсу, либо по электронной почте, либо распечатать. Вместо того, чтобы создавать методы для каждого, я создал сервис для каждого, заставил их реализовать интерфейс, имеющий единственный метод Output (). Затем я мог бы передать каждую службу одному и тому же методу в зависимости от того, какой вывод хочет пользователь. Когда заказчик хотел использовать eFax вместо отправки факсов через модем, оставалось просто написать новую службу, реализующую тот же интерфейс.

1
ответ дан 18 December 2019 в 07:09
поделиться

У вас есть много параметров, TT, метод расширения, делегат и лямбда

0
ответ дан 18 December 2019 в 07:09
поделиться

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

0
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

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