C# 在类中创建多个属性级别
我曾经使用过一些API,这些API似乎是其他实体中方法的实例,但我还没有弄清楚如何为自己重新创建这些API。例如,如果我有一个名为“House”的类,并且该房屋中有不同的门,我想在其中一扇门中放置一个窗口,那么处理该实例的代码如下所示:C# 在类中创建多个属性级别,c#,class,C#,Class,我曾经使用过一些API,这些API似乎是其他实体中方法的实例,但我还没有弄清楚如何为自己重新创建这些API。例如,如果我有一个名为“House”的类,并且该房屋中有不同的门,我想在其中一扇门中放置一个窗口,那么处理该实例的代码如下所示: House myHouse = New House; myHouse.Rooms("living room").Doors("front").PlaceWindow("frosted four pane"); 我希望我的陈述有意义。我已经在VB.Net中生活了
House myHouse = New House;
myHouse.Rooms("living room").Doors("front").PlaceWindow("frosted four pane");
我希望我的陈述有意义。我已经在VB.Net中生活了几个月,我们刚刚开始切换回C。我真的很好奇这个,这个,这个方面
我希望有一个这样易于使用和操作的对象,并且根据我目前的知识,我只能将属性和方法放在一个类中。我只是不知道应该在搜索引擎中搜索什么来找出如何创建这种类(或者它是什么类型的编译)。如果有人能把我引向正确的方向,那将大有裨益。这种方法有一些危险;看 但是,如果希望这样做,只需使用希望拥有的子对象创建每个对象 对于您的示例,您可以创建以下内容:
public class House
{
private readonly List<Room> _rooms = new List<Room>();
public Room Rooms(string roomName)
{
return _rooms.Single(x => x.Name == roomName);
}
public void AddRoom(string roomName)
{
_rooms.Add(new Room { Name = roomName });
}
}
public class Room
{
private readonly List<Door> _doors = new List<Door>();
public string Name { get; set; }
public Door Doors(string doorName)
{
return _doors.Single(x => x.Name == doorName);
}
public void AddDoor(string doorName)
{
_doors.Add(new Door { Name = doorName });
}
}
public class Door
{
private readonly List<Window> _windows = new List<Window>();
public string Name { get; set; }
public Window Windows(string windowName)
{
return _windows.Single(x => x.Name == windowName);
}
public void PlaceWindow(string windowName)
{
_windows .Add(new Window { Name = windowName });
}
}
public class Window
{
public string Name { get; set; }
}
公共类房屋
{
私人只读列表_rooms=新列表();
公共房间(字符串roomName)
{
返回_rooms.Single(x=>x.Name==roomName);
}
public void AddRoom(字符串roomName)
{
_添加(新房间{Name=roomName});
}
}
公共教室
{
私有只读列表_doors=新列表();
公共字符串名称{get;set;}
公共门(字符串门名称)
{
返回_doors.Single(x=>x.Name==doorName);
}
public void AddDoor(字符串doorName)
{
_添加(新门{Name=doorName});
}
}
公共舱门
{
私有只读列表_windows=new List();
公共字符串名称{get;set;}
公共窗口(字符串windowName)
{
返回_windows.Single(x=>x.Name==windowName);
}
公共void PlaceWindow(字符串windowName)
{
_添加(新窗口{Name=windowName});
}
}
公共类窗口
{
公共字符串名称{get;set;}
}
这里有一种替代的模块化方法,可以更轻松地构建多层对象
public abstract class NamedObject
{
public string Name { get; set; }
}
public class ComponentCollection<T> where T : NamedObject
{
private readonly List<T> _components = new List<T>();
public T this[string name]
{
get { return Get(name); }
}
public T Get(string name)
{
return _components.Single(x => x.Name == name);
}
public void Add(T component)
{
_components.Add(component);
}
public void Remove(string name)
{
_components.RemoveAll(x => x.Name == name);
}
}
这种模式通常称为流畅的语法/接口。方法链接是构建流畅界面的技术方面。看一看,我只是想感谢大家的帮助。所有的洞察力都得到了充分的赞赏。我也一直在阅读链接,玩这个肯定是一种享受。大家好!
public class House
{
public readonly ComponentCollection<Room> Rooms = new ComponentCollection<Room>();
}
public class Room : NamedObject
{
public readonly ComponentCollection<Door> Doors = new ComponentCollection<Door>();
}
public class Door : NamedObject
{
public readonly ComponentCollection<Window> Windows = new ComponentCollection<Window>();
}
public class Window : NamedObject
{
}
[TestMethod]
public void House_AddFrostedPaneWindowToLivingRoomFrontDoor_WindowExists()
{
var myHouse = new House();
myHouse.Rooms.Add(new Room { Name = "Living Room" });
myHouse.Rooms["Living Room"].Doors.Add(new Door { Name = "Front" });
myHouse.Rooms["Living Room"].Doors["Front"].Windows.Add(new Window { Name = "Frosted Four Pane" });
var window = myHouse.Rooms["Living Room"].Doors["Front"].Windows["Frosted Four Pane"];
Assert.IsNotNull(window);
}