Как достичь многих-многих отношений между монгольскими моделями

UPDATE: этот вопрос был предметом моего блога в декабре 2013 года . Спасибо за большой вопрос!


Вы можете сделать это, в некотором смысле. Но я должен начать с краткого обсуждения базового принципа проектирования разрешения перегрузки в C #. Разумеется, все разрешения перегрузки включают набор методов с тем же именем и выбор из этого набора уникального лучшего участника для вызова.

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

И поэтому мы пропустим список. Производные классы ближе, чем базовые классы. Внутренние классы ближе, чем внешние классы. Методы в иерархии классов ближе, чем методы расширения.

И теперь мы подошли к вашему вопросу. Близость метода расширения зависит от (1), сколько пробелов в пространстве имен мы должны были уйти? и (2) нашел ли мы метод расширения через using или был ли он правильным в пространстве имен? Поэтому вы можете повлиять на разрешение перегрузки, изменив в пространстве имен ваш статический класс расширения, чтобы поместить его в более близкое пространство имен на сайт вызова. Или вы можете изменить свои объявления using, чтобы поместить using пространства имен, которое содержит желаемый статический класс, ближе другого.

Например, если у вас есть

namespace FrobCo.Blorble
{
  using BazCo.TheirExtensionNamespace;
  using FrobCo.MyExtensionNamespace;
  ... some extension method call
}

, тогда это двусмысленно, что ближе. Если вы хотите расставить приоритеты по своему усмотрению, вы можете сделать это:

namespace FrobCo
{
  using BazCo.TheirExtensionNamespace;
  namespace Blorble
  {
    using FrobCo.MyExtensionNamespace;
    ... some extension method call
  }

И теперь, когда разрешение перегрузки идет для разрешения вызова метода расширения, классы в Blorple сначала идут, затем классы в FrobCo.MyExtensionNamespace, затем в классах FrobCo, а затем в классах BazCo.TheirExtensionNamespace.

Ясно, что

0
задан Jobin 13 July 2018 в 06:04
поделиться