Lecture Set 11 Creating and Using Classes Part B – Class Features – Constructors, Methods, Fields, Properties, Shared Data Objectives Describe these members of a class: constructor, method, field, and property Explain how instantiation works Describe the concept of overloading a method Explain what a shared member is Common Class Elements (repeated) Classes contain other elements: Procedures (methods) – functions and subs – operations that can be performed by an object. Constructors – special type of method that’s executed when an object is instantiated Data stores (including properties) Other forms – objects of the form data type Numerous objects of types defined by other classes Variables (of primitive types) Events (and Event handlers -- not always tied to forms) – an event is a signal that notifies other objects that something noteworthy has occurred Common Class Elements User defined data types – structures, enumerations, complex structured types (arrays of structures, lists or arrays of objects, etc) Delegate - A special type of object that’s used to wire an event to a method Data Stores (continued - repeated) Property - Represents a data value associated with an object instance Field - A variable that’s declared at the class level Constant - A constant associated with the class Default property - A special type of property that is used by default if a property name isn’t specified. It must include a parameter, which is typically used to access individual items within a class that represents a collection of objects. Operator - A special type of method that’s performed for a Visual Basic operator such as + or =. How Instantiation Works The process of creating an object from a class is called instantiation You can create many instances of a single class A class defines a reference type The variable that is created for the object of a class thus contains a reference to the memory location where the object is stored and not the object itself When an object is instantiated the appropriate constructor is executed Fields Fields are class variables that are global to (accessible by) all of the executable components of a class Usually declared as private and are not accessible outside the class May also be declared as public or protected and may also be declared using the friend modifier Fields (continued) The desirable goal in using classes is to encapsulate and protect class data stores from external reference except through methods of the class Declaring fields as public defeats the purpose of using classes If accessing some class data stores from outside the class is considered cumbersome, we can access them through the use of properties, which simplifies the access mechanism we have to use while still protecting the data Examples of Field Declarations Private m_quantity As Integer ' A private field Public Price As Decimal ' A public field Public ReadOnly Limit As Integer = 90 ' A public read-only field A Class that Uses Public Fields (Instead of Properties) Public Class Product Public Code As String Public Description As String Public Price As Decimal Public Sub New() End Sub Public Sub New(ByVal code As String, _ ByVal description As String, _ ByVal price As Decimal) Me.Code = code Me.Description = description Me.Price = price End Sub Shared versus Instance Data Class data can be instance data or shared data Shared data is declared with the Shared keyword One copy exists no matter the number of class instances One copy of instance data exists for each class instance How are shared data useful? A Note on Designing with Shared Data NOTE: A shared function operates within the context of shared data – it can access any shared data in a class, but it cannot access instance members How is the shared counter NextHuman used below? Public Class Human '*** instance members Private ID As Integer Public Function GetInfo() As String Return "Human #" & CStr(ID) End Function '*** shared members Private Shared NextHuman As Integer = 1 Public Shared Function GetNextHuman() As Human Dim temp As New Human() temp.ID = NextHuman NextHuman += 1 Return temp End Function End Class '*** factory method The Product Class with Public Fields (continued) Public Function GetDisplayText(ByVal sep As String) _ As String Dim text As String = Code & sep _ & FormatCurrency(Price) _ & sep & Description Return text End Function End Class Using Properties to Access Private Data If we wish to provide more convenient access to the private or protected data of a class, we can do so through the use of public properties The Syntax for Coding a Public Property Public [ReadOnly|WriteOnly] Property PropertyName As type [Get [statements] {PropertyName = propertyvalue} | {Return propertyvalue} End Get] [Set(ByVal variableName As type) [statements] propertyvalue = newvalue End Set] End Property Different Types of Properties A read/write property Public Property Code() As String Get Return m_Code End Get Set(ByVal value As String) m_Code = value End Set End Property A read-only property Public ReadOnly Property DiscountAmount() As Decimal Get m_DiscountAmount = Subtotal * DiscountPercent Return m_DiscountAmount End Get End Property Accessing Properties A statement that sets a property value product.Code = txtProductCode.Text A statement that gets a property value Dim code As String = product.Code Methods Classes contain subs and functions The public subs and functions are called methods There also can be private subs and functions I call these methods as well (although the book does not seem to) Why might we want a private method? Methods perform operations on the data stores (attributes) of a class Method Signatures and Overloading A method’s signature is defined by its name and its unique combination of parameters Note that the return value is not involved – it is assumed to always be the same We can write methods having the same name but different sets of parameters This is known as overloading Overloading provides multiple ways of invoking a given method Methods and Overloading A method that accepts a parameter Public Function GetDisplayText(ByVal sep As String) _ As String Dim text As String = Code & sep _ & FormatCurrency(Price) _ & sep & Description Return text End Function An overloaded version of the method that doesn’t accept parameters Public Function GetDisplayText() As String Dim text As String = Code & ", " _ & FormatCurrency(Price) _ & ", " & Description Return text End Function Overloading and Intellisense How does Intellisense handle overloaded functions (when it shows you the parameter list) Two statements that call the method lblProduct.Text = product.GetDisplayText(vbTab) lblProduct.Text = product.GetDisplayText() How the IntelliSense feature lists overloaded methods Constructors By default, VB will provide you with a default constructor for each class you write When you use new to create a new object (an instance of a class), the VB default constructor assigns default values to all instance variables of the new object If this is not what you want, you can write your own constructor(s) by taking advantage of overloading How does the compiler know which constructor is being referenced when you use New applied to a type (class) with multiple constructors Overloading Constructors A constructor with no parameters Public Sub New() End Sub A constructor with three parameters Public Sub New(ByVal code As String, _ ByVal description As String, _ ByVal price As Decimal) Me.Code = code Me.Description = description Me.Price = price End Sub More on Constructors A constructor with one parameter Public Sub New(ByVal code As String) Dim p As Product = ProductDB.GetProduct(code) Me.Code = p.Code Me.Description = p.Description Me.Price = p.Price End Sub Statements that call the constructors Dim product1 As New Product Dim product2 As New Product("VB05", _ "Murach's Visual Basic 2005", 52.5D) Dim product3 As New Product(txtCode.Text) Default Values for Instance Variables Data type All numeric types Boolean Char Date Object Default value 0 (zero) False Null (binary 0) 01/01/01 00:00:00 Null reference Murach’s Visual Basic © 2006, Mike Murach 2005, C11 Slide 24 A Class that Contains Shared Members (optional) Public Class Validator Private Shared m_Title As String = "Entry Error" Public Shared Property Title() As String Get Return m_Title End Get Set(ByVal value As String) m_Title = value End Set End Property Public Shared Function IsPresent(ByVal textBox _ As TextBox) As Boolean If textBox.Text = "" Then MessageBox.Show(textBox.Tag.ToString _ & " is a required field.", Title) textBox.Select() Return False Slide 25 A class that contains shared members (cont.) Else Return True End If End Function End Class Code that uses shared members If Validator.IsPresent(txtCode) AndAlso _ Validator.IsPresent(txtDescription) AndAlso _ Validator.IsPresent(txtPrice) Then isValidData = True Else isValidData = False End If Class Shared Members (optional) A class that contains shared members (cont.) Else Return True End If End Function End Class Code that uses shared members If Validator.IsPresent(txtCode) AndAlso _ Validator.IsPresent(txtDescription) AndAlso _ Validator.IsPresent(txtPrice) Then isValidData = True Else isValidData = False End If The Product Class Property Code Description Price Method GetDisplayText(sep) Constructor New() (optional) Description A String variable; contains a product code. A String variable; contains a description of the product. A Decimal variable; contains the product’s price. Description Returns a string with the code, description, and price separated by the sep string. Description Creates a Product object with default values. New(code, description, price) Creates a Product object using the specified values. The ProductDB Class (optional) Method Description GetProducts() A shared method that returns a List() of Product objects from the Products file. SaveProducts(list) A shared method that writes the products in the specified List() of Product objects to the Products file. Note You don’t need to know how the ProductDB class works. You just need to know about its methods so you can use them in your code. The Validator Class Property Title Shared method IsPresent(textBox) IsInt32(textBox) IsDecimal(textBox) (optional) Description A shared string; contains the text that’s displayed in the title bar of a dialog box for an error message. Returns a Boolean value that indicates whether… Data was entered into the text box. An Integer type was entered into the text box. A Decimal type was entered into the text box. IsWithinRange(textBox, min, max) The value entered into the text box is within the specified range. The Code for the Product Maintenance Form (optional) Public Class frmProductMaint Private products As List(Of Product) Private Sub frmProductMaint_Load( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load products = ProductDB.GetProducts Me.FillProductListBox() End Sub Private Sub FillProductListBox() lstProducts.Items.Clear() For Each p As Product In products lstProducts.Items.Add(p.GetDisplayText(vbTab)) Next End Sub