0

I created a Wall class that contains the height and width of a wall, and I need to create a list of four Wall classes inside the Room class, how could I do that? I didn't want to use List would there be another way? Sorry, I'm new to OOP programming.

void main() {
  
  Wall wall = Wall();
  
  print(wall.totalArea);
  wall.height = 4;
  wall.width = 4;
  wall.getAreaTotal();
  print(wall.totalArea);
}

class Room {
 
}


class Wall {
  double height;
  double width;
  late double totalArea;
  
  Wall({
     this.height = 1,
     this.width = 1,
  }) {
    getAreaTotal();
  }
  
  void getAreaTotal(){
    totalArea = height * width;
  }
}

1
  • You can define 4 Wall objects in your Room class Commented Dec 14, 2022 at 14:31

2 Answers 2

1

The room has four walls. Probably, if we assume a rectangular room, otherwise things get more complicated.

The most general approach is to not assume four walls, and just say that the room has a list of walls.

class Wall {
  final double height;
  final double width;
  Wall({required this.height, required this.width});
  double get totalArea => height * width;
}
class Room {
  final List<Wall> walls;
  Room(Iterable<Wall> walls) : walls = List.unmodifable(walls);
}

void main() {
  var room = Room([
    Wall(width: 4, height: 4),
    Wall(width: 2, height: 4),
    Wall(width: 4, height: 4),
    Wall(width: 2, height: 4),
  ]);
  var wallArea = 0.0;
  for (var wall in room.walls) wallArea += totalArea;
}

That allows any combination of walls, for your basic L-shaped rooms with six walls, or heptagonal rooms for style.

In some cases, you can make things easier by making assumptions. Like a rectangular room always have identical opposing walls, and same height everywhere.

Then you can do:

class RectangularRoom implements Room {
  final double length1;
  final double length2;
  final double height;
  final List<Room> rooms;
  RectangularRoom({
      required this.length1, 
      required this.length2, 
      required this.height}) 
      : rooms = _createWalls(length1, length2, height);
  static List<Room> _createWalls(
      double length1, double length2, double height) {
    var wall1 = Wall(length: length1, height: height);
    var wall2 = Wall(length: length2, height: height);
    return List.unmodifiable([wall1, wall2, wall1, wall2]);
  }
}

Or you can assume the room is oriented in some way:

// Also assumed rectangular.
class OrientedRoom extends Room {
  final Wall northWall;
  final Wall westWall;
  final Wall southWall => northWall;
  final Wall eastWall => westWall;
  OrientedRoom({
      required double length1, 
      required double length2, 
      required double height
  }) : this._(Wall(length: length1, height: height), 
              Wall(length: length2, height: height));

  OrientedRoom._(this.northWall, this.westWall) 
      : super([northWall, westWall, northWall, westWall]);
}

That allows you to name the individual walls, and have a class field for each.

So many options. What is right for you depends on your use-case, what you will use the objects for.

Sign up to request clarification or add additional context in comments.

Comments

0

Like @Dimon said in comment, you can manage it by adding a property for each Wall you want in your Room.

Something like this :

class Room {
  final Wall leftWall;
  final Wall rightWall;
  final Wall topWall;
  final Wall bottomWall;

  Room(this.leftWall, this.rightWall, this.topWall, this.bottomWall);

}

And creating your Room as follow :

var room = Room(Wall(height: 15, width: 20), Wall(height: 15, width: 8),
        Wall(height: 15, width: 3), Wall(height: 15, width: 22));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.