在接口中定义时如何实现 class?

How to implement a class when it is defined in an interface?

接口中可以有一个class,但我不明白如何实现这样的接口。下面我举个例子:

我写了下面没有任何界面的简单代码:

Imports System

Module Program
    Sub Main()
        Dim n As New name("Mounisha", "Ghosh")
        Dim student As New Student(n, 14)
        Console.WriteLine("First Name: {0}", student.studentName.firstName)
        Console.WriteLine("Last Name: {0}", student.studentName.lastName)
        Console.WriteLine("Age: {0}", student.age)
        Console.ReadLine()
    End Sub
End Module

Class name
    Public Property firstName As String
    Public Property lastName As String

    Sub New(ByVal f As String, ByVal l As String)
        firstName = f
        lastName = l
    End Sub
End Class

Class Student
    Private nameValue As name
    Public ReadOnly Property studentName() As name
        Get
            Return nameValue
        End Get        
    End Property
    Public Property age As Integer
    Sub New(ByVal n As name, ByVal a As Integer)
        nameValue = n
        age = a
    End Sub
End Class

然后我尝试通过将class name放在一个接口中并在class学生中实现它来重新组织。但是我无法构建我的代码。我在下面给出了我试图构建的代码的总体思路:

Imports System

Interface IClass
    Class name
        Public Property firstName As String
        Public Property lastName As String

        Sub New(ByVal f As String, ByVal l As String)
            firstName = f
            lastName = l
        End Sub

    End Class
End Interface

Module Program
    Sub Main()
        'How to create instances and pass values to constructors?
    End Sub
End Module

Class Student : Implements IClass
    'The idea is to create a readonly property of type "name"
    'But not able to use the Interface to do the same
    Public Property age As Integer
End Class

主要思想是了解如何实现带有class的接口。请帮助。

我要强调的另一点是,在 class name 的构造函数中我写了 End Sub。现在我们不能在接口中使用 end sub 语句 - 那么为什么我没有收到错误?另外,语句 firstName = flastName = l 不表示应该被编译器标记为错误的实现 - 但没有得到任何错误。对此有什么解释吗?

您所做的只是在界面中添加一个嵌套的 class。这不被视为实现 class 必须实现的东西,而只是通过该接口可用的 class。使用您的结构,为了要求 Student 实现只读名称 属性,您必须将 属性 添加到接口中。

Public Interface IClass
    ReadOnly Property Fullname As Name

    Class Name
        Public Property FirstName As String
        Public Property LastName As String

        Sub New(firstName As String, lastName As String)
            Me.FirstName = firstName
            Me.LastName = lastName
        End Sub
    End Class
End Interface

你的 Student Class 看起来像

Public Class Student : Implements IClass
    'Because Name is nested within IClass, it's referenced by IClass.Name
    Public ReadOnly Property Fullname As IClass.Name Implements IClass.Fullname
    Public Property Age As Integer

    Public Sub New(name As IClass.Name, age As Integer)
        Fullname = name
        Me.Age = age
    End Sub
End Class

创建学生将是

Dim name = New IClass.Name("Mounisha", "Ghosh") 'again we access name via the interface
Dim student = New Student(name, 14)

通常你不会在界面中添加嵌套的 Class 而是做类似

的事情
Module Program
    Sub Main()
        Dim studuent = New Student(New Name("Mounisha", "Ghosh"), 14)
    End Sub
End Module

Interface IClass
    ReadOnly Property Fullname As Name
End Interface

Public Class Name
    Public Property FirstName As String
    Public Property LastName As String

    Sub New(firstName As String, lastName As String)
        Me.FirstName = firstName
        Me.LastName = lastName
    End Sub
End Class

Class Student : Implements IClass
    Public ReadOnly Property Fullname As Name Implements IClass.Fullname
    Public Property Age As Integer

    Public Sub New(name As Name, age As Integer)
        Fullname = name
        Me.Age = age
    End Sub
End Class