Тема: [VB] Як створити обʼєкт не вказуючи назву класу?

Хочу замість a = New ClassName писати a = New зсередини класу. Або хоча б замість вказування назви класи писати щось на кшталт Reflection.MethodBase.GetCurrentMethod.DeclaringType.Name.

Подякували: leofun011

2

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

Створюйте фабричний метод і генеруйте, що треба.

Подякували: leofun011

3

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

Не хочу.

Подякували: leofun011

4

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

javascriptIsLife написав:

Не хочу.

Змусьте себе

5

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

ну, я не зовсім зрозуміло що ви розумієте під "зсередини класу". Сучасний синтаксис дозволяє такі маніпуляції

var variable1 = new MyClassType();
MyClassType variable2 = new();

якщо MyClassType в вас занадто довге, і бажаєте скоротити на більш лаконічне, можна використовувати using

using Alias = FullNamespaceName.MyClassType;

//...

var variable1 = new Alias();
Alias variable2 = new();

Якщо в вас який типизований метод/класс, можна в умовах типу вказувати необхідність наявності порожнього конструктора.

void MyMethod<T>() where T : new
{
    var variable = new T();
}
Подякували: leofun011

6 Востаннє редагувалося javascriptIsLife (16.06.2023 16:17:57)

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

Отак:

Class MClass
  Sub New()
    Console.WriteLine("Constructor")
  End Sub

  Shared Sub Create
    Dim objMe = New
  End Sub
End Class

7

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

Виглядає як щось дуже упороте. І якщо New хочаб в теорії можливо працюватиме (хоча ця економія літер в сучасних IDE абсолютно позбавлена сенсу, а в умовному блокноті заважає пошуку), то Dim objMe = New -- повністю невалідно для компілятора, так як неможливо визначити що там тип даних ви намагаєтесь ініціалізувати.

8

Re: [VB] Як створити обʼєкт не вказуючи назву класу?

javascriptIsLife написав:
    Dim objMe = New

Відки компілятор має знати якого типу objMe ти хочеш ?

Тут 3 способи створити екземпляр:

  • Imports Alias = ...

  • Generic T As {New}

  • Activator.CreateInstance(Of T)()

Imports C = VB_Project.SomeSpace.SomeClass

Namespace SomeSpace
    Public Class SomeClass
        Sub New()
            Console.WriteLine("{0} Constructor", Me.GetType().FullName)
        End Sub
        Public Shared Function Create() As C
            Return New C()
        End Function
        ' or
        Public Shared Function CreateNew(Of T As {New})() As T
            Return New T()
        End Function
        ' or
        Public Shared Function CreateInstance(Of T)() As T
            Return Activator.CreateInstance(Of T)()
        End Function
    End Class
    Module MyModule
        Sub Main()
            Dim obj As New C
            obj = C.Create()
            obj = C.CreateNew(Of C)()
            obj = C.CreateInstance(Of C)()
        End Sub
    End Module
End Namespace

* - проджект мав імя "VB_Project"