Vb.net 链接重载构造函数

Vb.net 链接重载构造函数,vb.net,constructor-overloading,constructor-chaining,Vb.net,Constructor Overloading,Constructor Chaining,我试图创建一个代码重复最少的高效类 我将其定义为: Public Class Foo Private _firstName as string = "" Private _lastName as string = "" Public Sub New(ByVal userGUID As Guid) 'query DB to get firstName and lastName Me.New(dt.Rows(0)("FirstName").T

我试图创建一个代码重复最少的高效类

我将其定义为:

Public Class Foo
    Private _firstName as string = ""
    Private _lastName as string = ""

    Public Sub New(ByVal userGUID As Guid)
        'query DB to get firstName and lastName
        Me.New(dt.Rows(0)("FirstName").ToString(),dt.Rows(0)("LastName").ToString())
    End Sub

    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        _firstName = firstName.toUpper()
        _lastName = lastName.toUpper()
        Validate()
    End Sub

    Private Sub Validate()
        ' Throw error if something is wrong
    End Sub
End Class
具有firstName和lastName参数的构造函数是执行验证的端点构造函数。以userGUID作为参数的构造函数将查询DB以获取名称并调用最终的构造函数。这样,所有的执行都应该指向一个实际执行所有验证等的构造函数。其背后的想法是,如果我添加新的构造函数,我只需要提取必要的数据(firstname/lastname)并调用执行验证的最终构造函数

但是,有一个编译错误阻止我在
me.New(dt.Rows(0)(“FirstName”).ToString()、dt.Rows(0)(“LastName”).ToString()行上使用此系统。
。显然,这一行必须是构造函数中的第一行。但是如果我把它作为第一行,它将中断验证过程,因为验证将抛出一个错误,因为没有firstname/lastname。我必须查询数据库才能获取这些信息

我知道我可以在这里赋值,也可以从这个构造函数调用验证,但这将有效地将这个构造函数与最后一个构造函数隔离开来,从而复制代码并增加维护工作量。仅供参考,在下面的示例中,我只有2个构造函数,但实际上我还有几个。如果每个人都能完成自己的任务,那么这只会增加维护工作量

那么,有没有办法通过执行一些代码然后调用重载构造函数来完成我的任务

谢谢你的见解

更新1:

根据_lotus的评论,我将包含dt定义。这个问题有一个解决办法。基本上,我会将验证和赋值从最终构造函数中取出,并将其放入函数中。所有构造函数都将调用此函数,因此无需链接构造函数。看起来不错,但我想理解为什么为了链接构造函数,我必须将构造函数调用放在第一行

以下是新代码:

公开课Foo Private _firstnameas String=“” Private _lastnameas String=“”

末级


还有一点不必提及:在线代码转换器(vb.net到C#)在转换非第一行的链式构造函数调用时没有问题。C代码返回为
this.#ctor(dt.Rows(0)(“FirstName”).ToString(),dt.Rows(0)(“LastName”).ToString() 我不喜欢的是,您在构造函数上访问DB,并且在构造函数中进行验证。我认为这是设计问题。下面是3个重载构造函数的示例。这三种方法都有效。你可能需要3英镑。在静态(vb共享)方法中初始化
dt
。还可以用一个同时包含这两个参数的参数替换fname/lname参数。这将对你起作用

public class A
{
    public A() : this ("xxx")
    {

    }
    public A(string x)
    {

    }
}

public class A
{
    public A() 
    {

    }
    public A(string x): this ()
    {

    }
}

public class A
{
    public A() : this(GetXxx())
    {

    }
    public A(string x)
    {

    }

    private static string GetXxx()
    {
        return "xxx";
    }
}

为什么要链接?因为您的对象可以在许多属性中具有默认值,并且您可能有许多构造函数,每个构造函数都添加一个属性。在内部,一个构造函数可以设置5个属性,其他4个构造函数只能设置1个属性

例如:

public class Door
{
    private string _material = "wood";
    private int _locks = 1;
    private int _hinges = 3;

    public Door()
    {

    }
    public Door(int locks) : this()
    {
        _locks = locks;
    }
    public Door(int locks, int hinges) : this(locks)
    {
        _hinges = hinges;
    }
}

我不喜欢的是,您在构造函数上访问DB,并且在构造函数中进行验证。我认为这是设计问题。下面是3个重载构造函数的示例。这三种方法都有效。你可能需要3英镑。在静态(vb共享)方法中初始化
dt
。还可以用一个同时包含这两个参数的参数替换fname/lname参数。这将对你起作用

public class A
{
    public A() : this ("xxx")
    {

    }
    public A(string x)
    {

    }
}

public class A
{
    public A() 
    {

    }
    public A(string x): this ()
    {

    }
}

public class A
{
    public A() : this(GetXxx())
    {

    }
    public A(string x)
    {

    }

    private static string GetXxx()
    {
        return "xxx";
    }
}

为什么要链接?因为您的对象可以在许多属性中具有默认值,并且您可能有许多构造函数,每个构造函数都添加一个属性。在内部,一个构造函数可以设置5个属性,其他4个构造函数只能设置1个属性

例如:

public class Door
{
    private string _material = "wood";
    private int _locks = 1;
    private int _hinges = 3;

    public Door()
    {

    }
    public Door(int locks) : this()
    {
        _locks = locks;
    }
    public Door(int locks, int hinges) : this(locks)
    {
        _hinges = hinges;
    }
}

我不喜欢的是,您在构造函数上访问DB,并且在构造函数中进行验证。我认为这是设计问题。下面是3个重载构造函数的示例。这三种方法都有效。你可能需要3英镑。在静态(vb共享)方法中初始化
dt
。还可以用一个同时包含这两个参数的参数替换fname/lname参数。这将对你起作用

public class A
{
    public A() : this ("xxx")
    {

    }
    public A(string x)
    {

    }
}

public class A
{
    public A() 
    {

    }
    public A(string x): this ()
    {

    }
}

public class A
{
    public A() : this(GetXxx())
    {

    }
    public A(string x)
    {

    }

    private static string GetXxx()
    {
        return "xxx";
    }
}

为什么要链接?因为您的对象可以在许多属性中具有默认值,并且您可能有许多构造函数,每个构造函数都添加一个属性。在内部,一个构造函数可以设置5个属性,其他4个构造函数只能设置1个属性

例如:

public class Door
{
    private string _material = "wood";
    private int _locks = 1;
    private int _hinges = 3;

    public Door()
    {

    }
    public Door(int locks) : this()
    {
        _locks = locks;
    }
    public Door(int locks, int hinges) : this(locks)
    {
        _hinges = hinges;
    }
}

我不喜欢的是,您在构造函数上访问DB,并且在构造函数中进行验证。我认为这是设计问题。下面是3个重载构造函数的示例。这三种方法都有效。你可能需要3英镑。在静态(vb共享)方法中初始化
dt
。还可以用一个同时包含这两个参数的参数替换fname/lname参数。这将对你起作用

public class A
{
    public A() : this ("xxx")
    {

    }
    public A(string x)
    {

    }
}

public class A
{
    public A() 
    {

    }
    public A(string x): this ()
    {

    }
}

public class A
{
    public A() : this(GetXxx())
    {

    }
    public A(string x)
    {

    }

    private static string GetXxx()
    {
        return "xxx";
    }
}

为什么要链接?因为您的对象可以在许多属性中具有默认值,并且您可能有许多构造函数,每个构造函数都添加一个属性。在内部,一个构造函数可以设置5个属性,其他4个构造函数只能设置1个属性

例如:

public class Door
{
    private string _material = "wood";
    private int _locks = 1;
    private int _hinges = 3;

    public Door()
    {

    }
    public Door(int locks) : this()
    {
        _locks = locks;
    }
    public Door(int locks, int hinges) : this(locks)
    {
        _hinges = hinges;
    }
}

您正在寻找的是工厂方法

Public Class Foo 

    Public Shared Function GetFooFromGuid(ByVal userGUID As Guid) As Foo

        ' Query db

        return New Foo(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Function

End Class
或初始化函数

Public Class Foo 

    Public Sub New(ByVal userGUID As Guid)
        ' query DB to get firstName and lastName
        Initialize(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Sub

    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        Initialize(firstName, lastName)
    End Sub

    Private Sub Initialize(ByVal firstName As String, ByVal lastName As String)
    End Sub

End Class

就个人而言,我不会在一个新的数据库中调用数据库。

您正在寻找的是一个工厂方法

Public Class Foo 

    Public Shared Function GetFooFromGuid(ByVal userGUID As Guid) As Foo

        ' Query db

        return New Foo(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Function

End Class
或初始化函数

Public Class Foo 

    Public Sub New(ByVal userGUID As Guid)
        ' query DB to get firstName and lastName
        Initialize(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Sub

    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        Initialize(firstName, lastName)
    End Sub

    Private Sub Initialize(ByVal firstName As String, ByVal lastName As String)
    End Sub

End Class

就个人而言,我不会在一个新的数据库中调用数据库。

您正在寻找的是一个工厂方法

Public Class Foo 

    Public Shared Function GetFooFromGuid(ByVal userGUID As Guid) As Foo

        ' Query db

        return New Foo(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Function

End Class
或初始化函数

Public Class Foo 

    Public Sub New(ByVal userGUID As Guid)
        ' query DB to get firstName and lastName
        Initialize(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Sub

    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        Initialize(firstName, lastName)
    End Sub

    Private Sub Initialize(ByVal firstName As String, ByVal lastName As String)
    End Sub

End Class

就个人而言,我不会在一个新的数据库中调用数据库。

您正在寻找的是一个工厂方法

Public Class Foo 

    Public Shared Function GetFooFromGuid(ByVal userGUID As Guid) As Foo

        ' Query db

        return New Foo(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Function

End Class
或初始化函数

Public Class Foo 

    Public Sub New(ByVal userGUID As Guid)
        ' query DB to get firstName and lastName
        Initialize(dt.Rows(0)("FirstName").ToString(), dt.Rows(0)("LastName").ToString())
    End Sub

    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        Initialize(firstName, lastName)
    End Sub

    Private Sub Initialize(ByVal firstName As String, ByVal lastName As String)
    End Sub

End Class

就我个人而言,我不会在新数据库中调用数据库。

您没有显示dt的来源。您可以使用私有初始化方法或共享f