我在使用類似這樣的接口和類結構的系統工作重量輕,全對象:設計可互換使用
interface ILw // a lightweight interface definition
class Medium : ILw
class FullA : Medium // full class definitions
class FullB : Medium
class LwA : ILw // lightweight class definitions
class LwB : ILw
在我遇到的對象,可能是全部或輕便的系統,以及所以具有期望接口的功能。使用這種設計遇到的問題是,需要在對象的完整版本和輕量版本之間共享更多的數據和方法,而不是在ILw中定義的數據和方法。所以,我覺得自己需要做這樣的事情:
if (myvar is FullA)
{
(myvar as FullA).MyFunction()
}
else
{
(myvar as LwA).MyFunction()
}
其中MyFunction的()分別在每個阿芙拉和實現輕骨料,並且可以在相同的數據結構的工作。我想消除這種代碼重複。
我的C++背景似乎是多繼承的典型案例;即爲需要的數據和方法定義類別SharedA,並將其添加到父列表FullA和LwA。但我需要一些指導來幫助在C#和界面世界中思考這個問題。有沒有可以接受的模式來解決這個問題?
謝謝。
UPDATE:
隨着意見的幫助下收到到目前爲止,我已經能夠重構與1更好的設計)的中間接口需要共享數據的彙總和2)延伸類的方法來處理這些數據。理想情況下,這些(數據和方法)將被加入到相同的構造中。我覺得板子裏有mate-in,我只是看不到它。
public interface ILwBase { }
class Medium : ILwBase { }
public class LwDataA
{
static private int _count = 0;
public int id;
public LwDataA() { id = ++_count; }
}
public interface ILwA : ILwBase
{
LwDataA ExtData { get; }
}
public static class ExtLwA
{
public static void MyFunction(this ILwA o)
{
Console.WriteLine("id = " + o.ExtData.id);
}
}
class LwA : ILwA
{
private LwDataA _extData = new LwDataA();
public LwDataA ExtData { get { return (_extData); } }
}
class FullA : Medium, ILwA
{
private LwDataA _extData = new LwDataA();
public LwDataA ExtData { get { return (_extData); } }
}
class Program
{
static void Main()
{
ILwA a1 = new FullA();
ILwA a2 = new LwA();
a1.MyFunction();
a2.MyFunction();
}
}
這允許我只需要兩行LWA和FullA之間重複代碼所需的東西。它消除了通過聚合屬性(我以前的編輯)調用或實現聚合包裝的需要。
希望這澄清了我想要實現的。這是最好的解決方案嗎?
如果需要治療阿芙拉和輕骨料不同,可他們真正** **被稱被編碼到相同的接口?也許你的界面被設計打破了,需要做得更好/更全面? – Patashu 2013-05-09 01:36:10
@Patashu很多時候我不在乎我是否在使用「完整」對象。在這些情況下,我需要做的是在兩者之間共同使用的一小部分數據和方法。 – jltrem 2013-05-09 01:39:41
如果接口沒有爲你做(定義所有在這兩者之間通用的方法),那麼你的接口是壞的。 – Patashu 2013-05-09 01:41:13