如何实现这种继承

本文关键字:继承 实现 何实现 | 更新日期: 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();
    }
}