c# - 通用抽象类继承

标签 c# generics inheritance

说明:

我有一个像这样的抽象类:

public abstract class Serializer<T> where T : new()
{
    T obj { get; set; }

    public string ToXML()
    {
        // return string XML
    }
}

另一个继承这个抽象类的类:

public class Account : Serializer<Account>
{
    // Code
    // I don't want to have to implement the methods of 
    // the inherited class/interface.

}

我想像这样访问它:

Account account = new Account();
Console.WriteLine(account.ToXML());

问题:

我可以这样做并将 account 传递给属性 obj 以便 ToXML 可以执行将对象转换为字符串的任务?

Serializer s = new Serializer();
s.ToXML(account);

我更愿意让每个对象继承 Serialize 类及其所有方法,并且能够知道无需编辑任何内容,只需添加我现在可以访问这些类的继承即可方法。

另一方面,我觉得继承一个类违反了选择接口(interface)或类之间的is-acan-do原则,但我不认为当我已经编写了在类中通用执行此操作的代码时(即我不想实现该接口(interface)),想要重写所有方法。有没有办法像类一样继承接口(interface)的方法(无需实现/重写)。

最佳答案

尝试返回:

T obj { get { return (T)this; } }

但是,这意味着子类必须将自身提供为类型参数,这是奇怪的重复出现的"template"模式...但可以肯定的是,您不一定需要知道对象的类型编译时间将其序列化为 XML(如果您使用常用的序列化程序),因此在序列化程序方法中访问 this 就可以了,不需要该类型参数和该属性。

我个人更喜欢 hands off approach到抽象基类(使用 XmlSerializer ):

public interface MXmlSerializable { }
public static class XmlSerializable {
  public static string ToXml(this MXmlSerializable self) {
    if (self == null) throw new ArgumentNullException();
    var serializer = new XmlSerializer(self.GetType());
    using (var writer = new StringWriter()) {
      serializer.Serialize(writer, self);
      return writer.GetStringBuilder().ToString();
    }
  }
}

M 代表mixin。它实际上是一个带有扩展方法的标记接口(interface)。像这样使用它:

public class Account : MXmlSerializable { 
  ... 
}

...

Account account = new Account();
...
string accountXml = account.ToXml();

关于c# - 通用抽象类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035062/

相关文章:

java - K 和 V 的 HashMap 默认类型

generics - 为什么在具有泛型类型参数的结构定义中使用特征边界?

java - 比较泛型类型 Java

Java无法重写构造函数中使用的方法: The method setupAnimationFrames() of type Slime must override or implement a supertype method

c# - 如何使用二维数组来描述形状来绘制形状?

c# - 无法从均受 Azure AD B2C 保护的 MVC Web 应用程序访问 WebApi

c# - Entity Framework Core - 早期的数据迁移在模型更改时中断

java - 如何在 JavaScript 中实现这个 java 模式(使用继承)?

maven - 在 Maven 中自动激活父插件

c# - mono-service2 不会在 OSX 上创建锁定文件