gpt4 book ai didi

c# - 通用抽象类继承

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:28 24 4
gpt4 key购买 nike

解释:

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com