2013-04-10 1 views
-6

임 C#에서 두 클래스 사이에 assosiation을하려고합니다. 협회는 하나의 클래스 (클래스 하우스)에서 다른 클래스 (클래스 룸)의 1 끝 *에 네시 섹스 한 끝입니다. 다시 말해 클래스 룸의 데이터는 클래스 하우스 1에서 여러 번 사용할 수 있지만 적어도 한 번 이상 사용해야합니다.associations C#

방에는 한 개의 집만있을 수 있지만 집에는 적어도 한 개의 방 또는 여러 개의 집이 있어야합니다.

class house 
{ 
    string name; 
    int house_num; 

    list<room> rooms; 

    public house() 
    { 
     rooms = new list<room>(); 
     rooms.Add(new room()); 
    } 
} 

class room 
{ 
    int num_of_rooms; 

} 

이 내가 다음 주 CS 파일에 부르는 나는 지금까지이 있지만 개체의 인스턴스를 만들 것 같지 않습니다

.. ..

house 94 = new house(); 
room bedroom = new room(); 

house.addRoom(bedroom); 

그래서 기본적으로 집에는 적어도 한 개의 방이 있어야한다고 말하지만, 생각할 수있는만큼 많은 방을 가질 수 있습니다. 어떤 이유로 abbove doesnt는 코드의 'addRoom'부분을 좋아하는 것 같습니다.

제발 도와주세요!

+0

집 '94 = 새 집()'? 이것도 컴파일됩니까? – Nolonar

+0

관련이 없지만 변수 이름을 숫자로 시작할 수 없습니다. "94"를 "house94"또는 의미가있는 것으로 변경하십시오. – Dave

+0

집에 addRoom() 메소드가 없습니다. –

답변

1

당신은 여기에 몇 가지 좋은 예를 가지고 있지만, 여기에 C 번호에 대한 새로운 가이드 사람들을 도울 수있는 완전한 기능을 콘솔 예입니다했습니다. 이것은 초심자를 혼동시키지 않으려 고 노력하면서 복음이나 모범 사례가 아니지만 대부분의 것들 (읽기 전용 필드 수단은 생성자, 단순한 Property 등으로 만 설정할 수 있음)의 간단한 예를 포함했지만 좋은 시작을 희망합니다. !

namespace Example.ActualApp 
{ 
    using System; 
    using System.Collections.Generic; 

    /// <summary> 
    /// The Program 
    /// </summary> 
    internal class Program 
    { 
     /// <summary> 
     /// The main entry point. 
     /// </summary> 
     static void Main(string[] args) 
     { 
      // Create a new house with a bedroom 
      Room bedroom1 = new Room("Master bedroom"); 
      House sampleHouse = new House("My house", bedroom1); 

      // Add a room 
      Room sittingRoom = new Room("Main sitting room"); 
      sampleHouse.AddRoom(sittingRoom); 

      // Wait for user to press a button 
      Console.WriteLine("\r\nFinished, press a key to end."); 
      Console.ReadKey(); 
      return; 
     } 
    } 

    /// <summary> 
    /// House class 
    /// </summary> 
    internal class House 
    { 
     // Private fields 
     private readonly string _name = string.Empty; 
     private List<Room> _rooms = null; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="House"/> class. 
     /// </summary> 
     /// <param name="name">The name of the house.</param> 
     /// <param name="room">The default room.</param> 
     public House(string name, Room room) 
     { 
      // Store the house name and initialise the rooms collection 
      _name = name; 
      _rooms = new List<Room>(); 
      Console.WriteLine("New house created called '{0}'", name); 

      // Now add the default room 
      this.AddRoom(room); 
     } 

     /// <summary> 
     /// Adds a room to the house. 
     /// </summary> 
     /// <param name="room">The room.</param> 
     public void AddRoom(Room room) 
     { 
      _rooms.Add(room); 
      Console.WriteLine("Room called '{0}' added to house called '{1}'", room.Name, _name); 
     } 
    } 

    /// <summary> 
    /// Room class 
    /// </summary> 
    internal class Room 
    { 
     private string _roomName = string.Empty; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="Room"/> class. 
     /// </summary> 
     /// <param name="name">The name of the room.</param> 
     public Room (string name) 
     { 
      _roomName = name; 
      Console.WriteLine("New room created called '{0}'", name); 
     } 

     /// <summary> 
     /// Example property (never pass fields around) 
     /// </summary> 
     public string Name 
     { 
      get 
      { 
       return _roomName; 
      } 

      set 
      { 
       _roomName = value; 
      } 
     } 
    } 
} 
0

코드와 관련된 다른 문제를 살펴보면, house 클래스의 생성자에 방을 추가 할 수 있습니다. 그러면 방이 적어도 지정한 방을 가질 수 있습니다.

편집 : 당신이 요구하는지조차 확실하지 않다, 당신은 이미이 작업을 수행 할 것 : P

+0

모든 코드는 'house.addRoom (bedroom);'줄 전까지 허용됩니다. 그것은 코드의 'addRoom'부분을 허용하지 않을 것입니다. – Tom

+0

@Tom 메소드 addRoom이 정의되지 않았기 때문입니다. 적어도, 우리가 당신의 코드를 보면서 말할 수있는 것은 아닙니다. – Nolonar

1

나는 이것이 당신이 필요로하는 무엇을 당신이 확장 할 수 있습니다 기본적으로 무엇을 생각 :

// Define a class for a house 
public class House 
{ 
    // Constructor for the House class 
    // This gets called whenever your code creates a "new House(...);" 
    public House(Room room) 
    { 
     // Initialize the list of rooms. 
     _rooms = new List<Room>; 
     // Add the passed room to the list of rooms 
     _rooms.Add(room); 
    } 

    // This a "backing field" for the property below it. It is a 
    // private variable that stores information about the class. 
    private List<Room> _rooms; 
    // This is the property that exposes the above backing field. 
    // This property only has a "get" method, which means that you can only 
    // read the property value. However, you can still add rooms to the list, 
    // even though that may seem like writing. The difference is that you cannot 
    // assign a completely new list to the property. 
    public List<Room> Rooms 
    { 
     get { return _rooms; } 
    } 

    // You can add methods to a class to perform a task. 
    // The method below adds a room to the list of rooms. 
    public void AddRoom(Room room) 
    { 
     _rooms.Add(room); 
    } 
} 

public class Room 
{ 

} 

House 클래스의 생성자는 한 개의 공간을 차지하므로 하우스를 만들 때 처음부터 한 공간이 추가됩니다. 예 : House94 = new House(new Room());. House94.Rooms.Add(new Room())으로 전화하여 더 많은 방을 추가 할 수 있습니다.

+0

분명히 프로그래밍에 익숙하지 않은 누군가를 '등록 정보'와 혼동하는 것은 좋은 생각이 아닙니다. 내 2 센트. 그럼에도 불구하고 대답은 +1입니다. – Nolonar

+0

그래, 실제로 그것에 대해서도 생각하고 있었지만 다시 속성은 C#의 필수 부분입니다. –