关于仿制药,接口和基类需要帮助
问题描述:
假设我有这两个对象:关于仿制药,接口和基类需要帮助
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。
我不确定在这一点上我是否合理,或者我所要求的甚至可以与泛型相匹配。
答
我相信你不会得到在这里仿制药受益。原因是因为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; }
}
答
贾斯廷是正确的,没有修改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;
}
}
答
这是应该做的解决方案后,你在做什么:
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>
{
}
你是什么意思“变成一个通用的”是什么意思?你的课程是什么? – Hali 2012-04-24 16:21:34
你刚刚说,“接口...通用基类”?我头疼。 ;) – 2012-04-24 16:22:43
是的,它也让我的头也受到伤害。我希望它看起来像'公共类ObjectService:IObjectService'和第一个方法内部看起来类似于'公共T GetObject(T o){返回base.GetObject(o); }' – kei 2012-04-24 16:26:33