Введение
Этот вопрос вызван предложением Марка Гравелла, чтобы я выкладывал на этот сайт новые предложения по языковым функциям, чтобы собрать общее мнение о них.
Идея состоит в том, чтобы собрать, могут ли они быть полезными или, возможно, уже есть другой способ добиться того, чего я добиваюсь.
Предложение (ограниченные типы)
Нормальное объявление переменной в VB.Net записывается так:
Dim SomeVariable as SomeType
Я предлагаю разрешить следующую форму (ы)
Dim SomeVariable1 as {SomeType, ISomeInterface}
Dim SomeVariable2 as {SomeType, ISomeInterface, ISomeOtherInterface}
Этот синтаксис заимствован из стиля ограничения Vb.Net Generics
Зачем это разрешать? ... Для чего это хорошо?
Ну, конкретный случай, о котором я изначально думал, заключался в определении определенного подмножества элементов управления.
Я хотел создать интерфейс для ряда фабрик управления, который бы предоставлял элементы управления на основе некоторых бизнес-правил.
Потребитель этих элементов управления через интерфейс потребовал бы, чтобы все созданные элементы управления также реализовывали некоторую серию интерфейсов (только один в моем случае), которые давали всем этим элементам управления дополнительные возможности, которые обычно не обнаруживаются в обычных элементах управления.
Стоит отметить, что следующее в настоящее время не работает.
Public Interface ISpecialControl
End Interface
Public Interface IControlProvider
Function CreateControl(Of T As {Control, ISpecialControl})() As T
End Interface
Public Class SpecialTextBoxProvider
Implements IControlProvider
Public Function CreateControl(Of T As {Control, ISpecialControl})() As T Implements IControlProvider.CreateControl
Return New SpecialTextBox
End Function
End Class
Public Class SpecialTextBox
Inherits TextBox
Implements ISpecialControl
Public Sub New()
End Sub
End Class
Я думаю, что это переводит на C # как:
public interface ISpecialControl
{
}
public interface IControlProvider
{
T CreateControl<T>()
where T : Control, ISpecialControl;
}
public class SpecialTextBoxProvider : IControlProvider
{
public T CreateControl<T>()
where T : Control, ISpecialControl
{
return new SpecialTextBox();
}
}
public class SpecialTextBox : TextBox, ISpecialControl
{
}
Попытка вернуть "New SpecialTextbox" не удалась из-за невозможности привести SpecialTextbox к T.
"Value of type 'MyApp.SpecialTextBox' cannot be converted to 'T'"
Я понимаю, что моим фабрикам может быть разрешено возвращать простые элементы управления, и я могу проверить во время выполнения, если они реализуют ISpecialControl, но это приведет к проблемам во время выполнения, которые я бы предпочел проверить во время компиляции, поскольку это логическая возможность, даже если в настоящее время это не так практичный
Обновление: Идея состоит в том, что эти фабрики могут находиться во внешних (возможно, даже сторонних) сборках и могут зависеть от любых библиотек элементов управления, которые они хотят, создавая и возвращая производные этих элементов управления, которые также реализуют ISpecialControl.
Эти сборки могут быть обнаружены с помощью самоконфигурируемого отражения (Отражение при первом проходе, а затем конфигурация, которая затем используется при дальнейших запусках) и могут использоваться без каких-либо знаний вызывающей сборкой в отношении зависимости этих элементов управления.
Требуется, чтобы эти фабрики были построены, не передавая информацию о контроле, который они должны вызывать, поскольку это победило бы точку.
Так что вы думаете ... Это было бы полезно? ... Есть ли лучший способ достичь этого? Уже есть способ добиться этого?