说明:
我有一个像这样的抽象类:
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-a和can-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/