gpt4 book ai didi

c# - 通过泛型接口(interface)封装的正确方式

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:41 25 4
gpt4 key购买 nike

我的应用程序由独立的服务器和客户端组成。它们通过服务器创建和修改的对象进行通信。客户端提供该对象的只读接口(interface)。据我所知,这是在 OOP 中保持封装的正确方法。参见示例:

// Client-side

interface IBox<T> where T : ITool
{
IEnumerable<T> Tools { get; }
}

interface ITool
{
void Use();
}

// Server-side

class Box : IBox<Tool>
{
public List<Tool> ToolList = new List<Tool>();

public IEnumerable<ITool> Tools
{
get { return ToolList; }
}
}

class Tool : ITool
{
string _msg = "default msg";
public string Msg
{
get { return _msg; }
set { _msg = value; }
}

public void Use()
{
Console.WriteLine("Tool used! Msg: {0}", _msg);
}
}

如您所见,我必须使用泛型,因为我的对象形成了层次结构。

这看起来不错,直到我决定添加 Room带接口(interface)的类 IRoom ,不仅要概括 IBox ,但是 ITool也是:

interface IRoom<B, T>
where B : IBox<T>
where T : ITool
{
IEnumerable<B> Boxes { get; }
}

class Room : IRoom<Box, Tool>
{
public List<Box> BoxList = new List<Box>();

public IEnumerable<Box> Boxes
{
get { return BoxList; }
}
}

现在,假设我们有一个 Room不仅包括盒子。我至少需要 3 个完全不同的东西的集合,它们也是几种类型的集合。所以,一定有一棵大树,我的根类变成了这样的:Room : IRoom<Box, Tool1, Tool2, Tool3, Wardrobe, Coat, Jeans, Hat, Table, Computer, Book, Pen>

我不确定,这是对的。所以,我在问,什么是真正的 OOP 方式来实现我的任务? (没有反射、破坏封装、类型转换或其他不良技巧)

最佳答案

从 .NET Framework 4 和 C# 4 开始,您可以使用 IEnumerable 的协方差,而只是避免使用泛型。

// Client-side

interface IBox
{
IEnumerable<ITool> Tools { get; }
}

interface ITool
{
void Use();
}

// Server-side

class Box : IBox
{
public List<Tool> ToolList = new List<Tool>();

public IEnumerable<ITool> Tools
{
get { return ToolList; } // With .NET 3.5 and earlier cast here is neccessary to compile
// Cast to interfaces shouldn't be so much of a performance penalty, I believe.
}
}

class Tool : ITool
{
string _msg = "default msg";
public string Msg
{
get { return _msg; }
set { _msg = value; }
}

public void Use()
{
Console.WriteLine("Tool used! Msg: {0}", _msg);
}
}


interface IRoom
{
IEnumerable<IBox> Boxes { get; }
}

class Room : IRoom
{
public List<Box> BoxList = new List<Box>();

public IEnumerable<IBox> Boxes
{
get { return BoxList; } // and here...
}
}

这里描述泛型的协变和逆变:http://msdn.microsoft.com/en-us/library/dd799517.aspx

关于c# - 通过泛型接口(interface)封装的正确方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16360453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com