Реализация (С# 3). Автоматически реализуемые свойства

Реализация (С# 2). Строго типизированные коллекции

Реализация (С# 1). Реализация типа Product

Пример 1. Классы и коллекции

Рассмотрим тип данных Продукт, состоящий из названия товара и его цены.

using System.Collections;

class Product

{

string name;

public string Name { get { return name; } }

decimal price;

public decimal Price { get { return price; } }

public Product(string name, decimal price)

{

this.name = name;

this.price = price;

}

public static ArrayList GetSampleProducts()

{

ArrayList list = new ArrayList();

list.Add(new Product("West Side Story", 9.99m));

list.Add(new Product("Assasins", 14.99m));

list.Add(new Product("Frogs", 13.99m));

list.Add(new Product("Sweeney Todd", 10.99m));

return list;

}

public override string ToString()

{

return string.Format("{0}:{1}", name, price);;

}

}

static void Main (string[] args)

{

ArrayList list = Product.GetSampleProducts();

foreach (Product product in list)

Console.WriteLine(product.ToString());

Console.Read();

}

Ограничения/недостатки:

1. Список ArrayList во время компиляции не имеет никакой информации о том, что в нем будет находиться. (в созданный этим методом список можно добавить элементы других типов, что будет не замечено компилятором).

2. Свойство get открыто, соответственно, если потребуется добавить свойство set, оно также автоматически будет открыто.

3. Код рассчитан на инкапсуляцию только двух свойств, но при этом является довольно тяжеловесным.

Работа с обобщениями (список с указанием типа элементов); закрытые методы установки значений (которые потом используются в конструкторе). Таким образом исправлены два главных недостатка кода C#1.

using System.Collections.Generic;

class Product

{

string name;

public string Name

{

get { return name; }

private set { name = value; }

}

decimal price;

public decimal Price

{

get { return price; }

private set { price = value; }

}

public Product(string name, decimal price)

{

Name = name;

Price = price;

}

public static List<Product> GetSampleProducts()

{

List<Product> list = new List <Product> ();

list.Add(new Product("West Side Story", 9.99m));

list.Add(new Product("Assasins", 14.99m));

list.Add(new Product("Frogs", 13.99m));

list.Add(new Product("Sweeney Todd", 10.99m));

return list;

}

public override string ToString()

{

return string.Format("{0}:{1}", name, price);;

}

}

static void Main(string[] args)

{

List<Product> list = Product.GetSampleProducts();

foreach (Product product in list)

Console.WriteLine(product.ToString());

Console.Read();

}

Код по прежнему достаточно тяжеловесен.

Представлены автоматически реализуемые свойства и упрощенная инициализация. У свойств теперь нет никакого кода, нет видимых переменных. Использование только свойств улучшает целостность класса.

Закрытый конструктор без параметров обеспечивает инициализацию на основе свойств.

class Product

{

public string Name

{

get;

private set;

}

public decimal Price

{

get;

private set;

}

public Product(string name, decimal price) // вообще говоря от него //можно отказаться

{

Name = name;

Price = price;

}

Product() { } //обеспечивает инициализацию на основе свойств

public static List<Product> GetSampleProducts()

{

return new List<Product>{

new Product {Name = "West Side Story", Price = 9.99m},

new Product {Name = "Assasins", Price = 14.99m},

new Product {Name = "Frogs1", Price = 13.99m},

new Product {Name = "Sweeney Todd",Price= 10.99m}

};

}

public override string ToString()

{

return string.Format("{0}:{1}", Name, Price);;

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: