Property Programming Article Index for
Property
Website Links For
Property
 

Information About

Property Programming





SUPPORT IN LANGUAGES


Programming languages that support properties include Delphi , Visual Basic and C# . Some object-oriented languages, such as C++ and Java , don't support properties, and require the programmer to define a pair of ''accessor'' and '' Mutator '' methods instead.

In most languages, properties are implemented as a pair of accessor/mutator methods, but accessed using the same syntax as for public fields. Omitting a method from the pair yields a ''read-only'' or ''write-only'' property, the latter being rather uncommon.

In some languages with no built-in support for properties, a similar construct can be implemented as a single method that either returns or changes the underlying data, depending on the context of its invocation. Such techniques are used e.g. in Perl .


EXAMPLE SYNTAX


Delphi

type TPen = '''class'''
private
m_Color: Integer;
function Get_Color: '''Integer''';
procedure Set_Color(RHS: '''Integer''');
public
property Color: '''Integer read''' Get_Color '''write''' Set_Color;
end;

function TPen.Get_Color: '''Integer''';
begin
Result := m_Color
end;

procedure TPen.Set_Color(RHS: '''Integer''');
begin
m_Color := RHS
end;

''// accessing:''
var pen: TPen;
''// ...''
pen.Color := not pen.Color;

  • ''

  • ''Delphi also supports a 'direct field' syntax -''


''property Color: '''Integer read''' m_Color '''write''' Set_Color;''

''or''

''property Color: '''Integer read''' Get_Color '''write''' m_Color;''

''where the compiler generates the exact same code as for reading and writing''
''a field. This offers the efficiency of a field, with the safety of a property.''
''(You can't get a pointer to the property, and you can always replace the member''
''access with a method call.)''
  • )''



Visual Basic

' in a class named clsPen
Private m_Color As Long

Public Property Get Color() As Long
Color = m_Color
End Property

Public Property Let Color(ByVal RHS As Long)
m_Color = RHS
End Property

' accessing:
Dim pen As New clsPen
' ...
pen.Color = Not pen.Color


Visual Basic .Net


Public Class Pen

Private m_Color as Integer ' Private field

Public Property Color as Integer ' Public property
Get
Return m_Color
End Get
Set(ByVal Value as Integer)
m_Color = Value
End Set
End Property

End Class

' accessing:
Dim pen As New Pen()
' ...
pen.Color = Not pen.Color


C#

class Pen
{
private int m_Color; ''// private field''

public int Color ''// public property''
{
get
{
return m_Color;
}
set
{
m_Color = value;
}
}
}

''// accessing:''
Pen pen = new Pen();
''// ...''
pen.Color = ~pen.Color; ''// bitwise complement ...''

''// another silly example:''
pen.Color += 1; ''// a lot clearer than "pen.set_Color(pen.get_Color() + 1)"!''


Python

class Pen:
def __init__(self):
self._color = 0 ''# "private" variable''
self._readonly = "Don't Assign to Me!"

def _set_color(self, color):
self._color = color

def _get_color(self):
return self._color

color = property(_get_color, _set_color) ''# read/write access translates to get/set methods''

def _get_readonly(self):
return self._readonly

readonly = property(_get_readonly) ''# read-only access is provided (writing throws an exception)''

''# accessing:''
pen = Pen()
''# ...''
pen.color = ~pen.color ''# bitwise complement ...''

print pen.readonly ''# this prints "Don't Assign to Me!"''
pen.readonly = "Something Else" ''# this fails (raises an exception)''


PHP

class Pen {
private ;

function __set(, ) {
switch () {
case 'Color': ->_color = ; break;
}
}

function __get() {
switch () {
case 'Color': return ->_color; break;
}
}
}

= new Pen();
->Color = !->Color;
echo ->Color;


SEE ALSO