Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Помогите найти ошибку! (реализация класса) Добавлено: 16.07.11 01:35  

Автор вопроса:  DimBi
Доброй Всем ночи!
Не могу исправить код из книги, чтобы работал…
Или сам чего напортачил… Помогите разобраться!
Задание такое:
создать класс для манипуляции коллекцией книг.
класс BookStore должен использовать объекты Book для представления книг.
класс Book содержит свойства, моделирующие физический объект, который он представляет
(номер ISBN, название книги, количество страниц, цену и т.д.)
Каждая книга может иметь >=1 автора, поэтому свойство Authors - это коллекция, и реализуется
при помощи класса Authors.

схема такая:
класс BookStore - контейнер для класса Book, и предоставляет методы для добавления в и удаления из коллекции.
класс Book - контейнер для класса Authors


Public Class BookStore
    Private allBooks As New ArrayList()

    Public Function GetBookByISBN(ByVal ISBN As String) As Book 'в примере - без скобок: Book
        Dim i As Integer
        For i = 0 To allBooks.Count - 1
            If CType(allBooks(i), Book).ISBN = ISBN Then
                Return CType(allBooks(i), Book)
            End If
        Next
        Return Nothing
    End Function

    Public Function GetAutorBooks(ByVal AutorName As String) As Book() 'в примере - со скобками: Book()
        
    End Function

    Public Function AddBook(ByVal thisBook As Book) As Boolean
        allBooks.Add(thisBook)
    End Function

    Public Function RemoveBook(ByVal thisBook As Book) As Boolean
        allBooks.Remove(thisBook)
    End Function

    Public Class Book
        Private _Title As String
        Private _ISBN As String
        Private _Subtitle As String
        Private _Pages As Integer
        Private _Price As Decimal
        
        Public BookAuthors As New Authors()

        Public Property Title() As String
            Get
                Title = _Title
            End Get
            Set(ByVal value As String)
                _Title = value
            End Set
        End Property

        Public Overridable Property ISBN() As String
            Get
                ISBN = _ISBN
            End Get
            Set(ByVal value As String)
                _ISBN = value
            End Set
        End Property

        Public Property Subtitle() As String
            Get
                Subtitle = _Subtitle
            End Get
            Set(ByVal value As String)
                _Subtitle = value
            End Set
        End Property

        Public Property Pages() As Integer
            Get
                Pages = _Pages
            End Get
            Set(ByVal value As Integer)
                _Pages = value
            End Set
        End Property

        Public Property Price() As Decimal
            Get
                Price = _Price
            End Get
            Set(ByVal value As Decimal)
                _Price = value
            End Set
        End Property

        Public Class Authors
            Inherits ArrayList
        End Class
    End Class
End Class


Тестирование класса...
добавил на форму ListView, в котором планируется вывод основных свойств объекта Book.
ДАЛЕЕ:


Imports BookStore.BookStore 'добавлено мной

Public Class Form1
 
    Dim bs As New BookStore()   'этой строки небыло в примере
    Dim aBook As New Book() 'перенес сюда из события Load формы

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        bs = New BookStore() 'этой строки небыло в примере
        aBook = New Book()
        aBook.ISBN = "0123456780"
        aBook.Title = "Book Title 1"
        aBook.Price = CDec(10.99)
'Books.AddBook(aBook) - в примере было так, но пришлось переписать так:
        bs.AddBook(aBook)

        bs = New BookStore() 'этой строки небыло в примере
        aBook = New Book()
        aBook.ISBN = "012345671"
        aBook.Title = "Book Title 2"
        aBook.Price = CDec(13.99)
        aBook.BookAuthors.Add("Book 2 - Author 1")
        aBook.BookAuthors.Add("Book 2 - Author 2")
        bs.AddBook(aBook)

        bs = New BookStore() 'этой строки небыло в примере
        aBook = New Book()
        aBook.ISBN = "012345672"
        aBook.Title = "Book Title 3"
        aBook.Price = CDec(23.29)
        aBook.BookAuthors.Add("Book 3 - Author 1")
        aBook.BookAuthors.Add("Book 3 - Author 2")
        aBook.BookAuthors.Add("Book 3 - Author 3")
        aBook.BookAuthors.Add("Book 3 - Author 4")
        bs.AddBook(aBook)

        ShowAllTitles()

    End Sub

    Sub ShowAllTitles()
Dim aBook as New Bookstore.Book() ' эта строка удалена мною
        
        Dim LItem As ListViewItem
        Dim au As Integer

        ListView1.Items.Clear()

        For Each aBook In bs.allBooks ‘в примере было: For Each aBook In Books

            LItem= New ListViewItem()
            LItem.Text = aBook.ISBN
            ListView1.Items.Add(LItem)
            LItem.SubItems.Add(aBook.Title)
            LItem.SubItems.Add(aBook.Price.ToString)
            For au = 0 To Math.Min(0, aBook.BookAuthors.Count - 1)
                LITEM.SubItems.Add(aBook.BookAuthors.Item(0).ToString) ‘добавил  .ToString
            Next
            For au = 1 To aBook.BookAuthors.Count - 1
                LItem = New ListViewItem()
                LItem.SubItems.Add("")
                LItem.SubItems.Add("")
                LItem.SubItems.Add(aBook.BookAuthors.Item(au).ToString) ‘добавил  .ToString
                ListView1.Items.Add(LItem)
            Next
        Next
    End Sub

End Class


В итоге…
В ListView выводится только ISBN последней книги…. И больше ничего…
До внесенных мною изменений – код не выполнялся…

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 16.07.11 11:15
В ListView выводится только ISBN последней книги…. И больше ничего…

Ну так это же очевидно.. У тебя для каждой книги создается новое хранилище..
bs = New BookStore()

В результате, предыдущее хранилище со всеми книгами тупо теряется теряется. Удали такие команды из процедуры Load и дули следущие строки
  1.  
  2. Dim aBook As New Book() 'перенес сюда из события Load формы
  3. ...
  4.  bs = New BookStore() 'этой строки небыло в примере
  5. ...
  6. Dim aBook as New Bookstore.Book() ' эта строка удалена мною



И самое главное, ты должен понимать что хранилище книг должно быть 1 на все приложение.. именно это ты и делаешь в строке
Dim bs As New BookStore()

больше такого нигде не долно быть..

Ответить

Номер ответа: 2
Автор ответа:
 DimBi



Вопросов: 15
Ответов: 55
 Профиль | | #2 Добавлено: 16.07.11 12:42
Спасибо EROS!
Теперь выводятся ISBN всех книг.... И больше ничего...
Причем, ISBN расположены не в столбце, а в строке.
должно быть так:

ISBN         Title         Price Autors
12345671 Book Title 2 13,99р. Book 2 - Author 1
                Book 2 - Author 2
123456780 Book Title 1 11,99р.
12345672 Book Title 3 23,29р. Book 3 - Author 1
                Book 3 - Author 2
                Book 3 - Author 3
012345672X Book Title 4 11,99р. Book 4 - Author 1
                Book 4 - Author 2
                Book 4 - Author 3
                Book 4 - Author 4

а у меня выводится так:

0123... 0123...    0123...         0123...


Может ListView не настроен? Я им еще никогда не пользовался...

Ответить

Номер ответа: 3
Автор ответа:
 DimBi



Вопросов: 15
Ответов: 55
 Профиль | | #3 Добавлено: 16.07.11 16:05
Настроил ListView и всё получилось!
Спасибо!!!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам