【问题标题】:Static (and nested!) class静态(和嵌套!)类
【发布时间】:2012-04-01 12:52:16
【问题描述】:

我有一个代表游戏会话的类,我想要某种顺序,以便我可以做这样的事情:

public class Session
{
    public static class Rooms
    {
        // All the things about session's rooms etc

        public static void Load()
        {
            // Load stuff...
        }
    }

    public static class Details
    {
        // All the session details (username, age...)
    }

    // etc
}

这样,一切都更有条理,每个嵌套类都可以处理特定的东西......

但是,当然,有一个问题......

当我有一个 Session 类的实例时,我尝试执行以下操作:

Session x = new Session();

x.Rooms.Load();

我收到这样的错误:

无法通过表达式引用类型。改用“Program.Session.Rooms”。

请给点提示?

【问题讨论】:

  • 你到底在想什么????!!!??为什么RoomsDetails 必须是静态的?为什么不直接将Session 设为静态?为什么不直接将这两个属性公开为...属性?
  • 会话不能是静态的,因为每个实例代表不同的游戏会话...
  • 您意识到RoomsDetails 也是如此,对吧?它们只能有一个实例。
  • 那么为什么任何东西都必须是静态的?
  • @slugster 我认为可以让非静态类拥有自己的静态嵌套类...

标签: c# class static nested


【解决方案1】:

这个错误很好地解释了它。 Rooms 类与类型相关联,而不是与 Session 的实例相关联(Room 是静态的)。您必须通过 Session.Room.Load() 等访问其功能。

【讨论】:

    【解决方案2】:

    提示只是使用错误提示的内容:

    Session.Rooms.Load();
    

    解释一下:由于Session 是一个类型,即不是一个对象(类型的实例),并且包含一个嵌套的静态类型。因此,您仍然必须通过 Session 类型而不是通过 Session 的实例来访问嵌套的静态类型。

    【讨论】:

    • 这不是提示。这就是答案:P
    • 会话不是静态的:每个“会话”类都代表一个不同的游戏会话,但每个“会话”类都应该可以访问其他类,“房间”、“详细信息”等......
    • @user1264377 我已经添加了一些解释。
    【解决方案3】:

    由于是静态类,可以这样访问

    Session.Rooms.Load();
    

    编辑:根据您的评论,您可能应该像这样更改您的类结构

    每个“Session”类代表一个不同的游戏会话,但每个 其中应该可以访问其他类,“Rooms”、“Details”

    public class Session
    {
      public Rooms SessionRooms { set;get;}
      public Details SessionDetails { set;get;}
    }
    
    public class Rooms
    {
      public void Load() {}
    }
    
    public class Details()
    {
    }
    

    这里每个 Session 对象都有它自己的房间和细节。这些是特定于那些 Session 对象的。

    现在你可以这样做了

    Session objSes=new Session();
    objSes.Rooms.Load();
    

    确保在访问子属性(其他类)之前对其进行初始化。否则会出现空引用异常。

    编辑:根据您的评论,您想访问 Rooms 类中的 Details 类。在这种情况下,我将像这样向我的 Rooms 类添加 ParentSession 属性

    public class Rooms
    {
      public Session ParentSession { set;get;}
    
      public Rooms(Session parent)
      {
        this.ParentSession=parent;
      }
    
      public void Load() {}
    }
    

    在你的 SessionClass 中,你将父类对象传递给 Rooms 类的构造函数

    public class Session
    {
      public Rooms SessionRooms { set;get;}
      public Details SessionDetails { set;get;}
    
      public Session()
      {
        if(this.SessionRooms==null)
        {
          this.SessionRooms=new Room(this);
        }
        if(this.SessionDetails ==null)
        {
          this.SessionDetails =new Details(this);
        }
      }
    }
    

    您可以像这样从 Room 访问详细信息

    Session objSes=new Session();
    //do something...
    
    Room theRool=objSes.Room;
    //now to access the details like    
    theRoom.ParentSession.SessionDetails
    

    【讨论】:

    • 会话不是静态的:每个“会话”类都代表一个不同的游戏会话,但每个“会话”类都应该可以访问其他类,“房间”、“详细信息”等......
    • 好的,我明白了......但在这种情况下,例如,“房间”类无法访问“详细信息”中的任何信息上课,不是吗?
    • @user1264377 Rooms 类只能访问 Details 类公开的公共属性。
    • @user1264377:好的。现在我明白你的意思了。如果您希望 Rooms 类访问 Details 类,我会在创建子实例时向 Session 类型的 Rooms 类添加一个名为“ParentSession”的 PRperty,并访问 Details 类,如 objRooms.ParentSession.SessionDetails.YourMethod..
    • 这是我现在想做的,但我有一个问题:当我的“会话”对象的值发生变化时,“房间”或“详细信息”中的属性值是否"(或其他)也改变了?
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2017-06-22
    • 1970-01-01
    • 2011-09-11
    • 2013-05-11
    相关资源
    最近更新 更多