2012-10-17 52 views
4

我有一个抽象类,有两个构造函数。当另一个类继承这个类时,看起来我必须声明与基类具有相同签名的构造函数。这对我来说似乎有点多余。有没有办法在我的基类中有Sub New(Parameter as MyClass),并且这已成为默认的构造函数签名,除非派生类在其定义中包含它?我可以让我的派生类自动使用基础构造函数吗?

为了清晰起见,编辑:我希望这意味着我不想在调用基类的派生类中创建构造函数。我希望能够这样做:

Mustinherit Class MyBase 

    Sub New(MyParam As String) 

    End Sub 

End Class 

Class MyDerived 
    Inherits MyBase 

End Class 

注意现在派生类不调用基?

+1

刚刚看到您的编辑。你不能那样做;假设基类有一些从构造函数参数初始化的状态。在创建派生类对象时,如果不调用基类构造函数,编译器如何知道如何初始化从基类继承的状态?就像@ PhonicUK所说的,如果你的抽象类没有状态(没有字段),那么作为一个接口会更好。 –

+0

为了澄清这个问题:这不是询问基础构造函数是否可以避免被调用,而是询问该调用是否可以是*隐式的* - 不必编写简单调用通过基类的代码。恕我直言,虽然不得不这样做偶尔是不方便的,但编译器不会尝试自动生成此代码是很好的:如果允许此语法,那么读取MyDerived文本的人将不知道构造函数是否存在 - 必须寻找基地。另外,如果第二个构造函数被添加到'MyBase'中,则不能控制'MyDerived'中允许哪个构造函数。 – ToolmakerSteve

+0

...这是一个*代码编辑便利的例子* - 可以通过添加一个选项来“固定”*智能文本编辑器*(可以对您的解决方案的现有类进行实时分析):当您创建它建议构造函数调用基础构造函数。 – ToolmakerSteve

回答

-13

在VB.Net你使用:

MyBase.New(args)

你的构造方法的身体里面,没有多余的废话是在构造函数/方法签名中使用。

+0

我编辑了我的答案来展示一个例子。看来你的回答证实我不能这样做,但也许有一种方法可以使用我不熟悉的语法来使它工作。 – oscilatingcretin

+0

更新了我的答案。我怀疑你实际上不希望为此使用抽象类,而是一个接口。 – PhonicUK

+0

请更新您的答案,以实际回答问题。这应该是VB,而不是C# –

28

你的假设是错误的;您的派生类的构造函数可以具有任何签名,只要他们使用MyBase.New正确调用其基类的构造函数之一即可。这里有一个完整的例子:

Imports System 

Public Class MainClass 

    Shared Sub Main() 
     Dim w As New Window(5, 10) 
     w.DrawWindow() 

     Dim lb As New ListBox(20, 30, "Hello world") 
     lb.DrawWindow() 

    End Sub 
End Class 

Public Class Window 
    Public Sub New(ByVal top As Integer, ByVal left As Integer) 
     Me.top = top 
     Me.left = left 
    End Sub 'New 

    Public Sub DrawWindow() 
     Console.WriteLine("Drawing Window at {0}, {1}", top, left) 
    End Sub 

    Private top As Integer 
    Private left As Integer 

End Class 

Public Class ListBox 
    Inherits Window 

    Public Sub New(ByVal top As Integer, ByVal left As Integer, ByVal theContents As String) 
     MyBase.New(top, left) ' 
     mListBoxContents = theContents 
    End Sub 

    Public Shadows Sub DrawWindow() 
     MyBase.DrawWindow() 
     Console.WriteLine("Writing string to the listbox: {0}", mListBoxContents) 
    End Sub 

    Private mListBoxContents As String 

End Class 

编辑:你没有被强制保留或所有扩展基类的构造函数的签名。这是有效的,例如:

Public Class ListBox 
    Inherits Window 

    Public Sub New(ByVal theContents As String) 
     MyBase.New(20, 30) ' 
     mListBoxContents = theContents 
    End Sub 

    'More code 

End Class 
相关问题