Функции модуля перегрузки в проектах - PullRequest
0 голосов
/ 04 мая 2011

У меня есть решение с несколькими проектами. Один из проектов представляет собой набор общего кода, который будет управлять несколькими различными клиентскими приложениями и серверным приложением. У меня есть пространство имен Common, которое находится в проекте само по себе. Это пространство имен имеет несколько открытых функций: Formater и UnFormater. Эти функции отлично работают во всех других проектах. Однако в некоторых проектах я хотел бы иметь возможность перегружать эти функции. Перегрузки будут принимать структуру данных, уникальную только для этого конкретного проекта, и преобразовывать ее в формат, понятный Common Formater и UnFormater, а затем передавать им всю работу для выполнения.

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

Для демонстрации (пример кода):

Проект 1:

Namespace Common
    Public Module FormatingServices
        Public Function Formater(ByVal DataToFormat As String) As String
            'format the data
        End Function

        Public Function UnFormater(ByVal DataToUnFormat As String) As String
            'unformat the data
        End Function
    End Module
End Namespace

Проект 2:

Namespace Common
    Public Module FormattingServices
        Public Function Formater(ByVal DataToFormat As StringBuilder) As String
            Dim myString As String = DataToFormat.ToString
            Return Formater(myString)
        End Function

        Public Function UnFormater(ByVal DataToUnFormat As StringBuilder) As String
            Dim myString As String = DataToUnFormat.ToString
            Return UnFormater(myString)
        End Function
    End Module
End Namespace

В Project 2 на myString в обеих функциях я получаю следующую ошибку:

"Значение типа 'String' не может быть преобразовано в 'System.Text.StringBuilder'.

Как мне заставить это работать? Это вообще возможно?

UPDATE:

Вот решение, которое у меня есть до сих пор. Может кто-нибудь объяснить, почему это работает, а выше нет? Куча общих функций должна быть такой же, как функции в модуле, поэтому я не понимаю.

Проект 1:

Public Class FormattingServices
    Public Shared Function Formatter(ByVal myString As String) As String
        Return myString & myString
    End Function
End Class

Проект 2:

Imports System.Text

Namespace Common
    Public Class FormattingServices
        Inherits ClassLibrary1.FormattingServices
        Public Overloads Shared Function Formatter(ByVal myString As StringBuilder) As String
            Return Formatter(myString.ToString)
        End Function
    End Class
End Namespace

Проект 3:

Imports ClassLibrary2.Common.FormattingServices
Imports System.Text

Module Module1

    Sub Main()
        Console.WriteLine("String Test: " & Formatter("This is a test string."))
        Console.WriteLine("StringBuilder Test: " & Formatter(New StringBuilder("This is a test StringBuilder string.")))
        Console.Read()
    End Sub

End Module

1 Ответ

0 голосов
/ 04 мая 2011

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

Вам нужно будет включить имя проекта в пространство имен, если вы хотите сослаться на правильный объект. Project1.Common.Formater и Project2.Common.Formater (примечание C # обрабатывает это немного по-другому, поскольку имеет глобальный квалификатор, который вы можете изменить вместо этого)

Однако, исходя из того, для чего ты идешь, я думаю, что тебе может понадобиться совсем другой подход. Похоже, вы хотите, чтобы ваш вызывающий код сообщал вашему Formater, как действовать для некоторых частей его логики, но не для всех. Обычно это делается с помощью Inversion of Control или Inpension Injection.

На мой взгляд, с Dependency Injection немного легче начинать, так как он имеет низкое количество концептов.

...