Skip to content

Instantly share code, notes, and snippets.

@kopylovvlad
Last active September 14, 2018 11:28
Show Gist options
  • Save kopylovvlad/0648e941188fc6a5dff50388d14dc4bb to your computer and use it in GitHub Desktop.
Save kopylovvlad/0648e941188fc6a5dff50388d14dc4bb to your computer and use it in GitHub Desktop.
class AbstractLeaf
def initialize; end
def size
raise 'Called abstract method: size'
end
end
class AbstractComposite
attr_reader :subgroup
def initialize(args = {})
@subgroup = []
post_initialize(args)
end
def add(child)
subgroup.push(child)
self
end
def remove(child)
subgroup.remove(child)
self
end
def size
subgroup.map { |item| item.size }.reduce(:+) || 0
end
# subclasses may override
def post_initialize(args={})
nil
end
end
class FileItem < AbstractLeaf
attr_reader :size, :title
def initialize(args = {})
@size = args[:size]
@title = args[:title]
end
end
class Folder < AbstractComposite
attr_reader :title
def post_initialize(args={})
@title = args[:title]
end
end
file1 = FileItem.new(title: 'file1', size: 2)
file2 = FileItem.new(title: 'file1', size: 3)
puts file1.size
# 2
puts file2.size
# 3
folder1 = Folder.new(title: 'folder1')
puts folder1.size
# 0
folder1.add(file1)
puts folder1.size
# 2
folder1.add(file2)
puts folder1.size
# 5
folder2 = Folder.new(title: 'folder2')
puts folder2.size
# 0
folder2.add(FileItem.new(title: 'anotherfile', size: 10))
puts folder2.size
# 10
folder2.add(folder1)
puts folder2.size
# 15
folder3 = Folder.new(title: 'main folder')
puts folder3.size
# 0
folder3.add(folder1).add(folder2)
puts folder3.size
# 20
@araslanov-e
Copy link

В строке 71 должен быть 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment