我最近一直与提供商合作,我遇到了一个有趣的情况,我希望有一个抽象的静态方法.我读了一些关于这个主题的帖子,这有点意义,但有一个很清楚的解释吗?
静态继承就像实例继承一样工作.除非您不允许将静态方法设为虚拟或抽象.
class Program {
static void Main(string[] args) {
TestBase.TargetMethod();
TestChild.TargetMethod();
TestBase.Operation();
TestChild.Operation();
}
}
class TestBase {
public static void TargetMethod() {
Console.WriteLine("Base class");
}
public static void Operation() {
TargetMethod();
}
}
class TestChild : TestBase {
public static new void TargetMethod() {
Console.WriteLine("Child class");
}
}
Run Code Online (Sandbox Code Playgroud)
这将输出:
Base class
Child class
Base class
Base class
Run Code Online (Sandbox Code Playgroud)
但我想要:
Base class
Child class
Base class
Child class
Run Code Online (Sandbox Code Playgroud)
如果我可以在静态方法上,我会使TargetMethod虚拟,它会完成这项工作.但有没有可以达到同样的效果?
编辑:是的,我可以在子类中放置一个Operation副本,但这需要复制并将大量代码粘贴到每个子节点,在我的例子中大约是35个类,这是一个维护噩梦.
据我所知C#,不支持虚拟静态属性.如何实现这样的行为C#?
我想归档基类的所有派生类必须覆盖静态属性.获取派生类型,我想访问一个名为的静态属性Identifier
Type t = typeof(DerivedClass);
var identifier= (String) t.GetProperty("Identifier", BindingFlags.Static).GetValue(null, null);
Run Code Online (Sandbox Code Playgroud) 我有一个最小的接口,并将处理其类实现此接口的对象的集合.该集合(及其相关功能)不关心这些对象的名称之外的任何细节,将它们转换为XML的能力以及从XML解析它们的能力.
接口的未来实现将使用集合的元素做更多的事情,并且显然将实现它们自己的Parse和ToXml方法(集合将使用它们在遇到时适当地解析这些项).
不幸的是,我无法在界面中列出静态Parse方法(我已经阅读了这 三个 问题).让Parse方法需要一个实例对我来说没有意义.有没有办法要求接口的所有实现都有静态Parse方法?
public interface IFoo
{
string Name { get; }
string ToXml();
static IFoo Parse(string xml); // Not allowed - any alternatives?
}
Run Code Online (Sandbox Code Playgroud)