2012-04-24 50 views
1

假設我有這兩個對象:關於仿製藥,接口和基類需要幫助

public class Object1 
{ 
    string prop1; 
    string prop2; 
} 

public class Object2 
{ 
    string prop1; 
    int prop2; 
    int prop3; 
} 

及以下類&方法:

public class Object1Service 
{ 
    public Object1 GetObject(Object1 o) { return o; } 
    public void SaveProperty2(Object1 o, string s) { o.prop2 = s; } 
} 

public class Object2Service 
{ 
    public Object2 GetObject(Object2 o) { return o; } 
    public void SaveProperty2(Object2 o, int i) { o.prop2 = i; } 
} 

我如何把它變成一個通用的?
我最好需要一些東西,以便服務實現一個接口,並儘可能調用一些通用基類。
如果兩個對象共享一個共同的父類,它會有所幫助嗎?如果是這樣,他們將如何構建?


附錄:

這是我的真正的問題的回報。

public T GetObjectByKey<T>(string key) 
{ 
    using (DBEntities db = new DBEntities()) 
    { 
     try 
     { 
      T returnedEntity = default(T); 

      switch (EntityDictionary[typeof (T)]) 
      // I have a dictionary setup like this dictionary<type, string> 
      { 
       case "Object1" : 
        returnedEntity = (from r in db.ObjectONESets 
             where r.prop1 == key 
             select new T 
             { 
              prop1 = r.prop1, 
              prop2 = r.prop2 
             }).FirstOrDefault(); 
        break ; 
       case "Object2" : 
        returnedEntity = (from r in db.ObjectTWOSets 
             where r.prop1 == key 
             select new T 
             { 
              prop1 = r.prop1, 
              prop2 = r.prop2, 
              prop3 = r.prop3 
             }).FirstOrDefault(); 
        break ; 
      } 
      return returnedEntity; 
     } 
     catch (NullReferenceException) 
     { 
      return default(T); 
     } 
    } 
} 

沒有把我所有的對象屬性的基本對象,它具有無法知道prop1-3的方式T.
的財產,如果我真的把所有的屬性(普通或不)在基對象,如果我需要Object1,它會附帶一個我不需要的prop3。
我不確定在這一點上我是否合理,或者我所要求的甚至可以與泛型相匹配。

+0

你是什麼意思「變成一個通用的」是什麼意思?你的課程是什麼? – Hali 2012-04-24 16:21:34

+1

你剛剛說,「接口...通用基類」?我頭疼。 ;) – 2012-04-24 16:22:43

+0

是的,它也讓我的頭也受到傷害。我希望它看起來像'公共類ObjectService:IObjectService'和第一個方法內部看起來類似於'公共T GetObject(T o){返回base.GetObject(o); }' – kei 2012-04-24 16:26:33

回答

5

我相信你不會得到在這裏仿製藥受益。原因是因爲prop2是這些類別中的每個類別中的不同類型。如果它們是相同的,那麼你可以把公共屬性成一個基類,做這樣的事情

public class BaseObject 
{ 
    string prop1; 
    string prop2 
} 

public class Object1 : BaseObject 
{ 

} 

public class Object2 : BaseObject 
{ 
    int prop3; 
} 

public class ObjectService<T> where T is BaseObject 
{ 
    public T GetObject(T o) { return o; } 
    public void SaveProperty2(T o, string i) { o.prop2 = i; } 
} 

你至少可以使GetObject的一個通用使用當前的例子......然而這整個方法真的似乎毫無意義:

public class ObjectService 
{ 
    public T GetObject<T>(T o) { return o; } 
    public void SaveObject2Property2(Object2 o, int i) { o.prop2 = i; } 
    public void SaveObject1Property2(Object1 o, string s) { o.prop2 = s; } 
} 
+0

在BaseObject中,您可以使prop2成爲通用的,這將允許ObjectService定義爲通用的。但我猜想OP確實需要一個ObjectService的實例,但可能不是。 – Sam 2012-04-24 16:44:13

+0

是的,我得到了非常相似的東西。這是什麼正在返回,這使我感到悲傷。也許我的帖子太籠統了。讓我稍微添加一下我原來的帖子。 – kei 2012-04-24 16:48:15

1

賈斯廷是正確的,沒有修改OP的對象,沒有辦法使這個「整齊」的通用。

這裏已是一片狼藉的解決方案:

interface IObject<T> 
{ 
    T prop2 {get;set;} 
} 

class ObjectService<T, Z> where T : IObject<Z> 
{ 
    public T GetObject(T o) 
    { 
     return o; 
    } 

    public void SetValue(T o, Z val) 
    { 
     o.prop2 = val; 
    } 
} 
3

這是應該做的解決方案後,你在做什麼:

public interface IPropertyProvider<T> 
{ 
    T Prop2 { get; set; } 
} 

public class ObjectService<T, TProp> where T : IPropertyProvider<TProp> 
{ 
    public void SaveProperty(T o, TProp i) 
    { 
     o.Prop2 = i; 
    } 
} 

public class Object1 : IPropertyProvider<string> 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

public class Object2 : IPropertyProvider<int> 
{ 
    public string Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
} 

public class Object1Service : ObjectService<Object1, string> 
{ 
} 

public class Object2Service : ObjectService<Object2, int> 
{ 
}