如何实现这种继承
本文关键字:继承 实现 何实现 | 更新日期: 2023-09-27 17:50:59
假设我有一些定义如下:
public interface ISerializable<TSource, TDest>
{
TDest Serialize();
TSource Deserialize(TDest dto);
}
现在我想让我所有的对象实现isserializable。所以:
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的存在。现在我想为序列化/反序列化提供一个通用的实现,因为它们中的大多数都是相同的。
public abstract class Serializable<TSource, TDest> : ISerializable<TSource, TDest>
{
TDest Serialize() {...}
TSource Deserialize(TDest dto) {...}
}
问题是,暴露给用户的接口是IA/IB/…虽然序列化/反序列化的常见实现是在抽象类C中实现的,但我可以同时实现IA并从C中派生,但最终用户仍然不能使用序列化函数,因为它们是在C中声明的。
有什么办法可以做到吗?
编辑:
如果我把IA改为AbstractA,那么AbstractA就可以从Serializable派生出来,某种程度上解决了问题。但是我不能使用接口的一些特性比如,我可以声明像
public interface IA
{
string Name { get; }
}
public class A : IA
{
public string Name { get; set; }
}
这样,我可以对最终用户隐藏setter,而在组装这些类时,我仍然可以不受限制地访问setter,因为我在内部使用A而不是IA。
我仍然不清楚是什么让你感到困惑。如果一个类需要一个具有isserialize方法的IA版本,请使用同时实现IA和isseriizable的IASerializeAware。这有帮助吗?
public interface ISerializable<out T1, T2>
{
T2 Serialize();
T1 Deserialize(T2 dto);
}
public interface IA<out T1, T2>
{
string Name { get; }
}
public interface IASerializeAware<out T1,T2> : IA<T1, T2>, ISerializable<T1,T2>
{
}
public abstract class ASerializeAwareBase<T1, T2> : Serializable<T1,T2>, IASerializeAware<T1,T2>
{
public string Name { get; set; }
}
public abstract class Serializable<T1, T2> : ISerializable<T1, T2>
{
public T2 Serialize()
{
throw new NotImplementedException();
}
public T1 Deserialize(T2 dto)
{
throw new NotImplementedException();
}
}