【问题标题】:How to implement this kind of inheritance如何实现这种继承
【发布时间】: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


【解决方案1】:

我仍然不清楚什么让你感到困惑。如果一个类需要具有 ISerialize 方法的 IA 版本,请使用实现 IA 和 ISerializeable 的 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();
    }
}

【讨论】:

  • 我可能在这里犯了一些错误。让我感到困惑的是,我认为 IASerializeAware 和 Serializable 都是从 ISerializable 派生的,然后在 ASerializeAwareBase 中我必须同时实现 IASerializeAware.Serialize/Deserialize 和 Serializable.Serialize/Deserialize。这就是当 2 个接口具有相同签名的方法时我们需要做的。但事实证明我错了。我会尝试一下,看看我是否还有其他问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2020-09-26
相关资源
最近更新 更多