我的應用程序由獨立的服務器和客戶端組成。它們通過服務器創建和修改的對象進行通信。客戶端提供此對象的只讀接口。據我所知,這是保持封裝在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
類接口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>
我不確定,那是對的。所以,我問,什麼是真正的面向對象的實現我的任務的方式? (沒有反射,打破封裝,類型轉換或其他不好的技巧)
您確實需要使用泛型???他們不是要形成層次結構,而是要處理許多不同的類型。但是既然你已經有了接口,並且它看起來你所有的類型參數都需要是單一的接口類型,你可以使用避免泛型的接口。 – 2013-05-03 13:59:46
我想'房間'有一個'List',我想把每個類的對象放到房間裏實現'IRoomItem'。同樣使用「Box」和「IBoxItem」。 –
Corak
2013-05-03 14:03:52
@Daniel我相信我需要在主題中描述的類型安全,封裝和功能:服務器創建和修改客戶端讀取。兩者都是獨立的。請提出沒有泛型的方式 – astef 2013-05-03 14:07:12