Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Manning - Windows Forms Programming With CSharp.pdf
Скачиваний:
72
Добавлен:
24.05.2014
Размер:
14.98 Mб
Скачать

5.2.4CREATING THE PHOTOGRAPH CLASS

The Photograph class represents a photograph stored in a file. Earlier, we laid out this class as follows.

public class Photograph

{

//Create a new instance from a file name.

//Properties:

//- get the file name for the Photograph

//- get the Bitmap for the Photograph

//Methods:

//- see if two Photographs are equal

}

While we could implement this class within the PhotoAlbum.cs file, it makes more sense to separate these two classes into two separate files. In this section we create this new class file and add some initial properties for the class. The following steps create our Photograph.cs source file.

 

 

ADD A PHOTOGRAPH CLASS FILE

 

 

 

 

 

Action

 

Result

 

 

 

 

1

Open the dialog to add a

 

The Add New Item dialog opens with the Class template

 

new class for the

 

selected.

 

MyPhotoAlbum project.

 

 

 

How-to

 

 

 

a. In Solution Explorer, click

 

 

the MyPhotoAlbum

 

 

 

project.

 

 

 

b. Open the Project menu.

 

 

 

c. Select Add Class….

 

 

 

Alternately

 

 

 

Right-click on the

 

 

 

MyPhotoAlbum project and

 

 

 

select Add Class… from

 

 

 

the Add submenu.

 

 

 

 

 

 

2

Create the new

 

A Photograph.cs file is added to the MyPhotoAlbum project,

 

“Photograph.cs” file.

 

and the default code displays in the main window.

 

How-to

 

 

 

Enter the appropriate name

 

 

 

and click the Open button.

 

 

 

 

 

 

CLASS LIBRARIES

141

 

 

ADD A PHOTOGRAPH CLASS FILE (continued)

 

 

 

 

 

Action

 

Result

 

 

 

 

3

Add some class

 

. . .

 

documentation.

 

/// <summary>

 

 

 

/// The Photograph class represents a single

 

 

 

/// photo and its properties.

 

 

 

/// </summary>

 

 

 

public class Photograph

 

 

 

. . .

 

 

 

 

Once again, let’s modify the namespace to be Manning.MyPhotoAlbum.

 

 

MODIFY THE NAMESPACE

 

 

 

 

Action

Result

 

 

 

4

Modify the namespace to be

. . .

 

Manning.MyPhotoAlbum.

namespace Manning

 

 

{

 

 

namespace MyPhotoAlbum

 

 

{

 

 

. . .

 

 

}

 

 

}

 

 

 

We now have a fully functional class as part of our library. Of course, it doesn’t do anything yet. Let’s start by tracking the file name and bitmap for the photograph.

DEFINE THE FILE AND BITMAP PROPERTIES

 

Action

Result

 

 

 

5

Create private member

public class Photograph

 

variables to track the file

{

 

name and any Bitmap

private string _fileName;

 

private Bitmap _bitmap;

 

object.

 

Note: Here and elsewhere in the book, we indicate that a

 

 

 

 

variable is private and not available outside of the con-

 

 

taining class by prefixing it with an underscore.

 

 

 

6

Create a constructor to

public Photograph(string fileName)

 

initialize these members

{

 

from a given file name.

_fileName = fileName;

 

_bitmap = null;

 

 

 

 

}

 

 

Note: We allow a Photograph to be created with an

 

 

invalid file name.

 

 

 

7

Create a FileName

public string FileName

 

property to return the

{

 

current file name.

get { return _fileName; }

 

}

 

 

 

 

 

142

CHAPTER 5 REUSABLE LIBRARIES

SetFile-

DEFINE THE FILE AND BITMAP PROPERTIES (continued)

 

Action

Result

 

 

 

8

Create an Image property

public Bitmap Image

 

to return the corresponding

{

 

Bitmap object.

get

 

{

 

 

 

Note: We intentionally

if (_bitmap == null)

 

ignore any error here. We

{

 

_bitmap = new Bitmap(_fileName);

 

will fix this later in the

 

}

 

chapter.

return _bitmap;

 

 

}

 

 

}

 

 

 

This is the first time we’ve created our own properties, so it is worth a short discussion. A property in C# is created much like a method. You define an access level, a type, and a name for the property. By convention, property and method names begin with a capital letter. The lack of parentheses after the name informs the compiler that this is a property and not a method.

Inside the braces, the access methods for the property are defined. The access methods provide read access, via the get keyword, or write access, via the set keyword. The get access method must return the defined type, while the set access method uses the reserved word value to access the value provided on the right side of the equals sign ‘=’. For example, if we wanted users of our Photograph class to set the FileName property, we could code this as follows:

public string FileName

{

get { return _fileName; }

set { _fileName = value; } // example only, not in our code

}

Of course, in an actual implementation it might be good to verify that the value provided to the set call is a real file and does indeed represent a photograph. For our purposes, the Photograph class is tied to a specific file name, so we do not provide a set implementation here. In this case the FileName property is said to be read-only, since the value can be read but not written.

Practically, properties permit safe access to a class without the need to expose internal variables or other features. To duplicate the get and set functionality for a file name member in C++, programmers typically provide methods such as

Name and GetFileName for this purpose. Properties formalize this concept for C# so that all programs use a standard mechanism for this style access.

Since properties are invoked similar to methods, additional calculations can be performed as part of their definition. In the code for the Image property, for example, the Bitmap is created as required before returning it to the user.

public Bitmap Image

{

get

CLASS LIBRARIES

143

{

if (_bitmap == null)

{

_bitmap = new Bitmap(_fileName);

}

return _bitmap;

}

}

Astute readers will note here that the given file may or may not exist and may or may not be an actual image file. We will handle any exception that occurs as a result of such an error in a moment.

We now have enough to link our classes into the main application. One problem remains: the MyPhotoAlbum project will once again not compile. Now the error is something like this:

Error The type or namespace name 'Bitmap' could not be found (are

you missing a using directive or an assembly reference?)

This is because Bitmap is part of the System.Drawing namespace, which is referenced by our MyPhotos project, but not the MyPhotoAlbum project. Unlike System.Collections, this namespace is provided in a separate library, namely the System.Drawing.dll library. We need to reference this DLL and then use it in our class.

ADD SYSTEM.DRAWING REFERENCE

 

Action

Result

 

 

 

9

Display the Add Reference

 

 

dialog for the

 

 

MyPhotoAlbum project.

 

 

 

 

10

Add System.Drawing.dll as

The System.Drawing assembly appears in the References list

 

a reference.

for the MyPhotoAlbum project.

 

How-to

 

 

a. Click the .NET tab.

 

 

b. Locate and click the Sys-

 

 

tem.Drawing.dll item

 

 

from the list.

 

 

c. Click the Select button.

 

 

d. Click the OK button.

 

 

 

 

11

Add a using directive for

The Photograph.cs file now contains two using directives:

 

the System.Drawing

using System;

 

namespace at the top of

 

using System.Drawing;

 

the file.

 

 

 

 

144

CHAPTER 5 REUSABLE LIBRARIES