MST
星途 面试题库

面试题:Visual Basic属性与方法的复杂应用

在Visual Basic中,假设有一个图形绘制的项目,定义一个`Shape`类,其中包含`Color`属性(用于设置图形颜色),`Draw`方法(用于在窗体上绘制图形)。请详细说明如何实现这个类,包括属性的验证逻辑(例如颜色是否符合指定格式)以及`Draw`方法如何根据不同的图形类型(例如圆形、矩形)进行绘制,同时要考虑图形可能存在的继承关系。请给出关键代码片段并解释。
30.8万 热度难度
编程语言Visual Basic

知识考点

AI 面试

面试题答案

一键面试

定义Shape类

Public Class Shape
    Private mColor As String
    'Color属性
    Public Property Color() As String
        Get
            Return mColor
        End Get
        Set(ByVal value As String)
            '简单的颜色格式验证,假设颜色格式为#RRGGBB
            If value.Length = 7 AndAlso value.StartsWith("#") Then
                Dim validChars As String = "0123456789ABCDEFabcdef"
                Dim isValid As Boolean = True
                For i As Integer = 1 To 6
                    If validChars.IndexOf(value(i)) = -1 Then
                        isValid = False
                        Exit For
                    End If
                Next
                If isValid Then
                    mColor = value
                Else
                    '处理颜色格式不正确的情况,例如抛出异常或设置默认值
                    Throw New ArgumentException("Invalid color format.")
                End If
            Else
                '处理颜色格式不正确的情况,例如抛出异常或设置默认值
                Throw New ArgumentException("Invalid color format.")
            End If
        End Set
    End Property

    '抽象的Draw方法,子类必须实现
    Public MustOverride Sub Draw(ByVal g As Graphics)
End Class

解释

  1. Color属性:使用Private变量mColor来存储颜色值。在Set访问器中进行颜色格式验证,要求颜色字符串长度为7且以#开头,后续6位为十六进制字符。如果格式不正确,抛出ArgumentException异常。
  2. Draw方法:定义为MustOverride,表示这是一个抽象方法,子类必须实现该方法来具体绘制图形。

圆形子类

Public Class Circle
    Inherits Shape
    Private mRadius As Integer
    Private mX As Integer
    Private mY As Integer

    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal radius As Integer)
        mX = x
        mY = y
        mRadius = radius
    End Sub

    Public Overrides Sub Draw(ByVal g As Graphics)
        Using brush As New SolidBrush(ColorTranslator.FromHtml(Me.Color))
            g.FillEllipse(brush, mX - mRadius, mY - mRadius, mRadius * 2, mRadius * 2)
        End Using
    End Sub
End Class

解释

  1. 继承关系Circle类继承自Shape类,因此必须实现Shape类中的抽象Draw方法。
  2. Draw方法实现:根据Circle类的属性(圆心坐标mXmY和半径mRadius),使用Graphics对象的FillEllipse方法在指定位置绘制一个填充的圆形。颜色使用ColorTranslator.FromHtml方法将存储的颜色字符串转换为Color对象用于绘制。

矩形子类

Public Class Rectangle
    Inherits Shape
    Private mX As Integer
    Private mY As Integer
    Private mWidth As Integer
    Private mHeight As Integer

    Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
        mX = x
        mY = y
        mWidth = width
        mHeight = height
    End Sub

    Public Overrides Sub Draw(ByVal g As Graphics)
        Using brush As New SolidBrush(ColorTranslator.FromHtml(Me.Color))
            g.FillRectangle(brush, mX, mY, mWidth, mHeight)
        End Using
    End Sub
End Class

解释

  1. 继承关系Rectangle类同样继承自Shape类,所以也要实现Draw方法。
  2. Draw方法实现:依据Rectangle类的属性(左上角坐标mXmY以及宽度mWidth和高度mHeight),利用Graphics对象的FillRectangle方法绘制一个填充的矩形。颜色处理方式与Circle类类似。