【发布时间】:2014-03-20 03:20:46
【问题描述】:
假设我有一些定义如下:
public interface ISerializable<TSource, TDest>
{
TDest Serialize();
TSource Deserialize(TDest dto);
}
现在我希望我的所有对象都实现 ISerializable。所以:
public interface IA<TSource, TDest> : ISerializable<TSource, TDest> {...}
public interface IB<TSource, TDest> : ISerializable<TSource, TDest> {...}
// more interface declaration...
public class A : IA
{
// implementation here
}
// more class declaration...
关键是,我正在做依赖注入。我希望人们对所有事情都使用 IA,我不希望他们知道 A 类的存在。现在我想为 Serialize/Deserialize 提供一个通用的实现,因为它们大多数都是相同的。
public abstract class Serializable<TSource, TDest> : ISerializable<TSource, TDest>
{
TDest Serialize() {...}
TSource Deserialize(TDest dto) {...}
}
问题是,暴露给用户的接口是 IA/IB/... 而 Serialize/Deserialze 的常见实现是在抽象类 C 中。我可以同时实现 IA 和从 C 派生,但最终用户仍然可以'不要使用序列化函数,因为它们是在 C 中声明的。
有没有办法做到这一点?
编辑:
如果我将 IA 更改为 AbstractA,那么 AbstractA 可以从 Serializable 派生,从而解决了这个问题。但是我不能使用接口的某些功能,例如,我可以声明属性,如
public interface IA
{
string Name { get; }
}
public class A : IA
{
public string Name { get; set; }
}
这样我可以对最终用户隐藏设置器,而在组装这些类时,我仍然可以不受限制地访问设置器,因为我在内部使用 A 而非 IA。
【问题讨论】:
-
你能在一个类中实现你的接口吗?让我们称之为
BaseClass,然后在你想使用你刚刚从BaseClass继承的序列化的类上调用它的方法? -
@juanreyesv 您好,感谢您的回答。我编辑了我的问题以获得进一步的解释。
-
只需将您的界面更改为该级别所需的任何内容。您可以从多个接口继承。
-
@DeveloperGuo 抱歉,我不完全理解您的回答。不止一个接口是指类 A 派生自 ISerializable 和 IA?
-
如果您需要一个同时公开 get;set; 的接口和一个只是得到,你可以为每个接口。您的抽象类可以实现两者。
标签: c# oop dependency-injection