2016-03-30 10 views
4

Ich versuche, mehr über Object Orientated Programming zu lernen.VB.NET Erstellen einer Klasse mit optionalen Eingabe

Ich versuche, eine Klasse zu erstellen, die ein konisches Objekt wie in diesem Bild darstellt.

enter image description here

A: Anschlussdurchmesser B: Durchmesser C: Höhe

Aber für mich gibt es einige Unterschiede gibt, wenn

1) einen Kegel zu wählen ist die Konusverbindung größer sein werde als der Durchmesser haben Sie einen sich erweiternden Kegel sonst einen Reduktionskegel. Dazu habe ich eine schreibgeschützte Eigenschaft basierend auf einer Enum erstellt, die im Konstruktor festgelegt ist. Dies wird beim Erstellen des Kegelobjekts festgelegt und ist behoben.

2) Wie möchten Sie es dimensionieren? Das Bild hat 3 Dimensionen, aber eine vierte ist ein Winkel. Wenn die Höhe die führende Dimension ist, sollte der Winkel berechnet werden. Wenn der Winkel eine führende Dimension ist, sollte die Höhe berechnet werden. Auch dafür habe ich eine schreibgeschützte Eigenschaft basierend auf einer Enum erstellt, die im Konstruktor gesetzt ist.

Aber wie sollte ich meine Eigenschaften markieren? In einem Fall sollte die Höhe schreibgeschützt sein und in der anderen der Winkel. Wie gehst du mit einer solchen Situation um?

Public Class Cone 

    Public ReadOnly Property ConeType As ConeTypeEnum 

    Public Enum ConeTypeEnum 
     kExpansion = 1 
     kReduction = 2 
    End Enum 

    Public ReadOnly Property DimensionType As DimensionTypeEnum 

    Public Enum DimensionTypeEnum 
     kAngle = 1 
     kHeight = 2 
    End Enum 

    Public Property Height As Double 
    Public Property Diameter As Double 
    Public Property ConnectionDiameter As Double 
    Public Property Angle As Double 

    Public Sub New(ByVal oConeType As ConeTypeEnum, 
        ByVal oDimensionType As DimensionTypeEnum) 

     ConeType = oConeType 
     DimensionType = oDimensionType 

    End Sub 

End Class 
+0

Nun, Sie können nicht dynamisch zwischen ReadOnly und nicht, AFAIK. Vielleicht könnten Sie Setter hinzufügen, die den Wert nicht ändern, wenn eine bestimmte Bedingung erfüllt ist/nicht erfüllt ist? –

+0

Es gibt viele Wege, dies zu lösen, da der Wert nur vom Konstruktor einstellbar ist, Methoden haben, die Eigenschaft zu setzen, wenn sie erlaubt sind, und auch zwei verschiedene Cone-Klassen, die die gleiche Cone-Schnittstelle implementieren. Angesichts der Tatsache, dass Sie eigentlich eine andere Implementierung von Eigenschaften möchten; Dann könnte der Schnittstellenansatz IMO Ihnen auf der ganzen Linie helfen. –

+2

Ist es möglich, den Winkel zu berechnen, wenn die Höhe geändert wird, und die Höhe zu berechnen, wenn der Winkel geändert wird? Wenn dies der Fall ist, können Sie beide Eigenschaften als Lesen/Schreiben belassen. – reduckted

Antwort

2

Hier ist, was ich tun würde:

den Kegel Typ Eigenschaft ermitteln dynamisch aus dem aktuellen A und B in einer schreibgeschützten Eigenschaft. Dies - wie ich es verstehe - ist nur ein Hinweis darauf, welchen Konustyp Sie haben.

Alle anderen Eigenschaften können gelesen/geschrieben werden, wobei die entsprechenden anderen Eigenschaften aktualisiert werden. Beispielsweise. Wenn der Benutzer den Winkel ändert, berechnen Sie die Höhe neu. Wenn der Benutzer die Höhe ändert, berechnen Sie den Winkel usw. neu.

Wenn Sie wirklich den Kegel-Typ festlegen möchten, würde ich es tun, wenn Sie den Konstruktor aufrufen. Ändern Sie dann die anderen Eigenschaften, sodass sie eine Ausnahme auslösen, falls A und B nicht zum aktuellen Konustyp passen.

Eine andere Möglichkeit wäre, eine Schnittstelle ICone mit allen erforderlichen Eigenschaften zu definieren und daraus die Klassen ExpansionCone und ReductionCone abzuleiten, die die Getter/Setter entsprechend implementieren.

0

Hier ist, was ich tun würde:

Public Class Cone 

    'First we have our dimensions 
    Public Property Height As Double 'C on your graph 
    Public Property DiameterUp As Double 'A on your graph 
    Public Property DiameterDown As Double 'B on your graph 

    'The cone Type can be calculated following the dimensions 
    Public ReadOnly Property ConeType As ConeTypeEnum 
     Get 
      If _diameterDown > _diameterUp Then 
       Return ConeTypeEnum.kReduction 
      ElseIf _diameterDown < _diameterUp Then 
       Return ConeTypeEnum.kExpansion 
      End If 
      'If they are equal it is a cylinder 
      Return ConeTypeEnum.kCylinder 
     End Get 
    End Property 

    Public Enum ConeTypeEnum 
     kExpansion = 1 
     kReduction = 2 
     kCylinder = 3 
    End Enum 

    'The angle is just recalculated everytime 
    Public Property Angle As Double 
     Get 
      Return 'Calculate here the angle value from the other dimensions 
     End Get 
     Set(value As Double) 
      'Calculate here the dimension values according the value specified for the angle 
     End Set 
    End Property 

    Public Sub New(Height As Double, DiameterUp As Double, DiameterDown As Double) 
     Me.Height = Height 
     Me.DiameterUp = DiameterUp 
     Me.DiameterDown = DiameterDown 
    End Sub 
End Class 
0

ich die Höhe oder Winkel dynamisch basierend auf berechnen würde, wenn der Benutzer einen Winkel bereitstellt oder eine Höhe. Wie Martin würde ich den Typ des Kegels dynamisch erhalten. Ich würde auch die neue Funktion privat setzen, um zu verhindern, dass Leute einen leeren Code erstellen und stattdessen (Fabrik-) Funktionen teilen. Da ein Kegel mit einem Winkel oder einer Höhe erstellt werden kann, muss der Benutzer Ihrer Klasse die richtige Funktion aufrufen, um das Objekt zu erstellen.

Cone.GetConeByAngle(...) 
Cone.GetConeByHeight(...) 

Mit der benutzerdefinierten Eigenschaft für Höhe und Winkel des anderen Wert zu berechnen. Jeder kann später die Höhe oder den Winkel ändern, wenn alles richtig berechnet ist.

Da ich keine Zeit habe, um die Mathematik zu suchen, habe ich CalculateAngle und CalculateHeight leer gelassen.

Ich weiß nicht, warum Sie "k" setzen, sind der Anfang Ihrer Enum-Werte.

Public Class Cone 

    Public Enum ConeTypeEnum 
     Expansion = 1 
     Reduction = 2 
     Cylinder = 3 
    End Enum 

    Private _height As Double 
    Private _angle As Double 

    Public Property Diameter As Double 
    Public Property ConnectionDiameter As Double 

    Public Property Height As Double 
     Get 
      Return _height 
     End Get 
     Set(value As Double) 
      _height = value 
      CalculateAngle() 
     End Set 
    End Property 

    Public Property Angle As Double 
     Get 
      Return _angle 
     End Get 
     Set(value As Double) 
      _angle = value 
      CalculateHeight() 
     End Set 
    End Property 

    Public ReadOnly Property ConeType As ConeTypeEnum 
     Get 
      If Diameter > ConnectionDiameter Then 
       Return ConeTypeEnum.Reduction 
      ElseIf Diameter < ConnectionDiameter Then 
       Return ConeTypeEnum.Expansion 
      End If 

      'If they are equal it is a cylinder 
      Return ConeTypeEnum.Cylinder 
     End Get 
    End Property 

    Private Sub New() 

    End Sub 

    Public Shared Function GetConeByAngle(ByVal angle As Double, ByVal diameter As Double, ByVal connectionDiameter As Double) 

     Dim newCone As New Cone 

     newCone.Diameter = diameter 
     newCone.ConnectionDiameter = connectionDiameter 
     newCone.Angle = angle 

     Return newCone 
    End Function 

    Public Shared Function GetConeByHeight(ByVal height As Double, ByVal diameter As Double, ByVal connectionDiameter As Double) 

     Dim newCone As New Cone 

     newCone.Diameter = diameter 
     newCone.ConnectionDiameter = connectionDiameter 
     newCone.Height = height 

     Return newCone 
    End Function 

    Private Sub CalculateAngle() 
     ' Calculate angle base on height 
     _angle = 0 
    End Sub 

    Private Sub CalculateHeight() 
     ' Calculate height base on angle 
     _height = 0 
    End Sub 

End Class 
+0

'Ich weiß nicht, warum Sie" k "setzen, sind der Anfang Ihrer enum Werte. Es ist eine Angewohnheit. Ich bin gewohnt, mit Autodesk Inventor zu programmieren, und in seiner API werden alle enums so beschrieben. Ich habe keine wirkliche Erklärung. –

Verwandte Themen