Properties


Set and Get

In order to manipulate an object usually the object implements pair of function, one function to get (retrieve) an object value and another function to modify Most programmer use the words Set and Get in the object function names to easily identity the purpose of the function as shown in the example. Some people use Put instead of Set.
Para poder manipular un objeto usualmente el objeto implementa pares de funciones, una función para consultar una propiedad del objeto y otra función para modificar esta propiedad como se muestra debajo. La mayoría de los programadores usan las palabras Set y Get en el nombre de las funciones del objeto para identificar el propósito de esta función como se muestra en el ejemplo. Algunas personas usan Put en lugar de Set.

Library.cpp
Book book;
book.SetTitle(L"Hamlet");
book.SetAuthor(L"Shakespeare");

SetGet

Problem 1
Indicate whether the following statement is true or false: A member Set function usually does not return any value, on the other hand, a member Get function returns the value of the property.
Diga si es verdadero o falso: Una función miembro del tipo Set usualmente no regresa ningún valor, en cambio una función del tipo Get regresa el valor de la propiedad solicitada.

Problem 2
Modify the Book class and test the following code in the Library project.
Modifique la clase Book y pruebe el siguiente código en el proyecto Library.

Book.h
#pragma once
class Book
{
public:
     Book(void);
     ~Book(void);
     void SetNumbPages(int numbPages);
     int GetNumbPages();
private:
     int numbPages;
};

Book.cpp
#include "StdAfx.h"
#include "Book.h"


Book::Book(void)
{
     numbPages = 0;
}

Book::~Book(void)
{
}

void Book::SetNumbPages(int numbPages)
{
     if (numbPages <= 5) return;
     if (numbPages >1000) return;
     this->numbPages = numbPages;
}

int Book::GetNumbPages()
{
     return numbPages;
}

Solution 1
As the numbPages member variable is private, the class provides a pair of functions to have access to it: SetNumbPages and GetNumbPages. The SetNumbPages function provides a special protection to the numbPages variable. Specifically, the function ensures that the number of pages in the book be greater than 5 and less than 1001. Observe how the this keyword is used to distinguish between the local and member variable.
Como la variable miembro numbPages es privada, la clase proporciona una par de funciones para tener acceso a esta: SetNumbPages y GetNumbPages. La función SetNumbPages proporciona una protección especial a la variable numbPages. Específicamente, la función asegura que el número de páginas sea mayor a 5 y menor a 1001. Observe como la palabra clave this es usada para distinguir entre la variable local y la variable miembro.

Problem 3
Test the following code in the Library project.
Pruebe el siguiente código en el proyecto Library.

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book a, b, c;
     a.SetNumbPages(10);
     b.SetNumbPages(20);
     b.SetNumbPages(2);
     c.SetNumbPages(1000);
     wstring text;
     Sys::Format(text, L"%d, %d, %d", a.GetNumbPages(), b.GetNumbPages(), c.GetNumbPages());
     this->Text = text;
}


Property

In some cases, the compiler can automatically decide between calling the Set function or the Get function by the use of a property as shown in the code below. Properties are very useful because they allow writing code that is easy to read.
En algunos casos, el compilador puede decidir automáticamente llamar a la función Set o la función Get mediante el uso de una propiedad como se muestra en el código de abajo. Las propiedades son muy útiles porque permiten escribir código que es fácil de leer.

Problem 4
Test the following code in the Library project. Note that the NumbPages property behaves like an integer variable. In some cases, the property call the SetNumbPages function, while in other cases, the property call the GetNumPages function.
Pruebe el siguiente código en el proyecto de Library. Note que la propiedad NumbPages se comporta como una variable entera. En algunos casos, la propiedad llama la función SetNumPages, mientras que en otros casos, la propiedad llama la función GetNumPages.

Book.h
#pragma once
class Book
{
public:
     Book(void);
     ~Book(void);
     void SetNumbPages(int numbPages);
     int GetNumbPages();
     __declspec( property( get=GetNumbPages, put=SetNumbPages ) ) int NumbPages;
private:
     int numbPages;
};

Book.cpp
#include "StdAfx.h"
#include "Book.h"


Book::Book(void)
{
     numbPages = 0;
}

Book::~Book(void)
{
}

void Book::SetNumbPages(int numbPages)
{
     if (numbPages <= 50) return;
     if (numbPages >100) return;
     this->numbPages = numbPages;
}

int Book::GetNumbPages()
{
     return numbPages;
}

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book x, y, z;
     x.NumbPages = 10; // This line will be replaced by x.SetNumbPages(10);
     y.NumbPages = 20; // This line will be replaced by y.SetNumbPages(20);
     y.NumbPages = 56; // This line will be replaced by y.SetNumbPages(56);
     z.NumbPages = 1000; // This line will be replaced by z.SetNumbPages(1000);
     z.NumbPages = -4; // This line will be replaced by z.SetNumbPages(-4);
     wstring text;
     Sys::Format(text, L"%d, %d, %d", x.NumbPages, y.NumbPages, z.NumbPages);
     this->Text = text;
}


Properties

A custom control may have some properties so that it can be configured. Behind a property, there are two functions: one to modify the property and another one to read the value of the property. A function that is used to modify a property (or value) is called a set function. On the other hand, a function that returns the value of a property is called a get function. In order to add a property, you need to add:
  1. A private member variable to store the property value
  2. A set function to set the property value (public member variable)
  3. A get function to retrieve the property value (public member variable)
  4. A property so that the compiler can call the set function or the get function

Un control personalizado puede tener algunas propiedades para que este pueda ser configurado. Detrás de cada propiedad, hay dos funciones: una para modificar la propiedad y otra para leer el valor de la propiedad. Una función que es usada para modificar una propiedad (o valor) es llamada función set. Por otro lado, una función que regresa el valor de la propiedad se llama función get. A fin de agregar una propiedad, usted necesita agregar:
  1. Una variable miembro privada para almacenar el valor de la propiedad
  2. Una función set para fijar la propiedad (una función miembro pública)
  3. Una función get para retraer el valor de la propiedad (una función miembro pública)
  4. Una propiedad para que el compilador pueda llamar a la función set o get

Tip
The code below shows how to implement properties in C#.
El código de abajo muestra como implementar las propiedades en C#.

Box.cs
class Box
{
     public public Box()
     {
          _width = 0;
     }
     public int Width
     {
          get
          {
               return _width;
          }
          set
          {     
               _width = value;
          }
     }
     private int _width;
};


Set function result

In some cases, a Set function may return a value to notify if the function was successfully executed as shown in the next problem.
En algunos casos, una función Set puede regresar un valor para notificar si la función fue ejecutada como se muestra en el problema siguiente.

Problem 5
Test the following code in the Library project.
Pruebe el siguiente código en el proyecto de Library.

Book.h
#pragma once
class Book
{
public:
     Book(void);
     ~Book(void);
     bool SetNumbPages(int numbPages);
     int GetNumbPages();
     __declspec( property( get=GetNumbPages, put=SetNumbPages ) ) int NumbPages;
private:
     int numbPages;
};

Book.cpp
#include "StdAfx.h"
#include "Book.h"

Book::Book(void)
{
     numbPages = 0;
}

Book::~Book(void)
{
}

bool Book::SetNumbPages(int numbPages)
{
     if (numbPages <= 50) return false;
     if (numbPages >100) return false;
     this->numbPages = numbPages;
     return true;
}

int Book::GetNumbPages()
{
     return numbPages;
}

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book m, n;
     if (m.SetNumbPages(51) == true)
     {
          if (n.SetNumbPages(20) == true)
          {
               n.SetNumbPages(82);
          }
          else
          {
               n.SetNumbPages(92);
          }
     }
     wstring text;
     Sys::Format(text, L"%d, %d", m.NumbPages, n.NumbPages);
     this->Text = text;
}

Tip
In some cases, it is necessary to check the return value of a function. In these cases, this may produce several nested if statements or a sequence of ifs making the code very difficult to write and read. To correct this problem, exceptions can be used as shown in the next problem.
En algunos casos, es necesario verificar el valor que una función regresa. En estos casos, esto puede producir varios if uno adentro de otro o una secuencia de ifs produciendo un código que es muy difícil de escribir y leer. Para corregir este problema, las excepciones pueden ser usadas como se muestra en el siguiente problema.

A try-catch block

When a sequence of instructions may throw an exception using the throw keyword, it is convenient to surround these instructions in a try-catch block as illustrated below.
Cuando una secuencia de instrucción puede aventar una excepción usando la palabra clave throw, es conveniente encerrar estas instrucciones un bloque try-cath como se ilustra debajo.

Problem 6
Test the following code in the Library project.
Pruebe el siguiente código en el proyecto de Library.

Book.h
#pragma once
class Book
{
public:
     Book(void);
     ~Book(void);
     void SetNumbPages(int numbPages);
     int GetNumbPages();
     __declspec( property( get=GetNumbPages, put=SetNumbPages ) ) int NumbPages;
private:
     int numbPages;
};

Book.cpp
#include "StdAfx.h"
#include "Book.h"


Book::Book(void)
{
     numbPages = 0;
}

Book::~Book(void)
{
}

void Book::SetNumbPages(int numbPages)
{
     if (numbPages <= 50) throw L"A book must have at least 50 pages";
     if (numbPages >100) throw L"A book must have at the most 100 pages";
     this->numbPages = numbPages;
}

int Book::GetNumbPages()
{
     return numbPages;
}

Library.cpp
...

void Library::Window_Open(Win::Event& e)
{
     Book m, n;
     wstring text;
     try
     {
          n.NumbPages = 71;
          m.NumbPages = 10;
     }
     catch(wchar_t* info)
     {
          this->MessageBox(info, L"Library", MB_OK | MB_ICONERROR);
     }

     Sys::Format(text, L"%d, %d", m.NumbPages, n.NumbPages);
     this->Text = text;
}


Problem 7
Indicate whether the following statement is true or false: A Get member function is usually easy to implement because it just returns the value of the respective member variable.
Diga si es verdadero o falso: Las funciones del tipo Get son fáciles de implementar ya que usualmente sólo regresan el valor de la variable privada que almacena el valor solicitado.

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home