我最近一直与提供商合作,我遇到了一个有趣的情况,我希望有一个抽象的静态方法.我读了一些关于这个主题的帖子,这有点意义,但有一个很清楚的解释吗?
我有一个辅助类,它只是一堆静态方法,并且想要辅助类的子类.某些行为是独特的,具体取决于子类,所以我想从基类调用虚方法,但由于所有方法都是静态的,我无法创建普通的虚方法(需要对象引用才能访问虚方法).
有没有办法解决?我想我可以使用单例.. HelperClass.Instance.HelperMethod()并不比HelperClass.HelperMethod()差.布朗尼指出任何可以指出支持虚拟静态方法的语言的人.
编辑:好的,我疯了.谷歌搜索结果让我觉得我不是那里的.
我最近遇到了一个问题,似乎我需要一个'静态抽象'方法.我知道为什么这是不可能的,但我怎样才能解决这个限制?
例如,我有一个抽象类,它有一个描述字符串.由于此字符串对于所有实例都是通用的,因此它被标记为static,但我想要求从此类派生的所有类都提供它们自己的Description属性,因此我将其标记为abstract:
abstract class AbstractBase
{
...
public static abstract string Description{get;}
...
}
Run Code Online (Sandbox Code Playgroud)
它当然不会编译.我想过使用接口但接口可能不包含静态方法签名.
我应该简单地使它成为非静态的,并且总是得到一个实例来获取特定于类的信息吗?
有任何想法吗?
为什么静态虚拟不可能?C#依赖还是在OO世界中没有任何意义?
我知道这个概念已被强调,但我没有找到上一个问题的简单答案.
我遇到了一个有趣的问题,我正在寻找一些关于如何最好地处理这个问题的建议......
我有一个抽象类,其中包含一个静态方法,该方法接受我想要定义为抽象属性的静态字符串.问题是C#不支持以下内容(请参阅ConfigurationSectionName和Current属性):
public abstract class ProviderConfiguration : ConfigurationSection
{
private const string _defaultProviderPropertyName = "defaultProvider";
private const string _providersPropertyName = "providers";
protected static string ConfigurationSectionName { get; }
public static Configuration Current
{
get { return Configuration)ConfigurationManager.GetSection(ConfigurationSectionName); }
}
}
Run Code Online (Sandbox Code Playgroud)
我想有一种方法可以解决这个问题,那就是使ConfigurationSectionName不是抽象的,然后在派生类中创建一个新的ConfigurationSectionName定义,但这感觉非常hackish.任何建议都是最受欢迎的.
Gratias!
静态继承就像实例继承一样工作.除非您不允许将静态方法设为虚拟或抽象.
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个类,这是一个维护噩梦.
我目前正在为二进制应用程序协议开发库.以下代码示例无法编译(抽象类型中不允许使用静态方法定义.太糟糕了:(),但显示了我的意图:
public abstract class CmdBody<T>
{
public static abstract byte[] ToBytes(T cmdBody);
public abstract int GetLength();
}
public class CmdBodyA : CmdBody<CmdBodyA>
{
static override byte[] ToBytes(CmdBodyA cmdBody)
{ // Implementation }
}
public class CmdBodyB : CmdBody<CmdBodyB>
{
static override byte[] ToBytes(CmdBodyB cmdBody)
{ // Implementation }
}
[...]
public class Cmd<T>
{
public CmdHeader Header { get; set; }
public CmdBody<T> Body { get; set; }
public byte[] ToBytes()
{
byte[] cmdBytes = new byte[Header.GetLength() + Body.GetLength()];
Header.ToBytes().CopyTo(cmdBytes, …Run Code Online (Sandbox Code Playgroud)