我最近一直与提供商合作,我遇到了一个有趣的情况,我希望有一个抽象的静态方法.我读了一些关于这个主题的帖子,这有点意义,但有一个很清楚的解释吗?
我知道这个问题一直被问到,但我似乎无法找到足够好的答案.所以为了弄清楚我想知道的是什么,我将把它分成两个问题:
为什么接口不能有静态方法签名?我将尝试抢占非答案,询问为什么在世界上我想用以下内容执行此操作:我希望能够静态调用GetDbConnectionType()on SqliteCodeGenerator和MssqlCodeGenerator:
interface ICodeGenerator
{
// this is the method I would like to be static:
string GetDbConnectionType();
}
abstract class CodeGeneratorBase : ICodeGenerator
{
public abstract string GetDbConnectionType();
public void GenerateSomeCode(StringBuilder s)
{
s.AppendLine("var foo = new " + GetDbConnectionType() + "();");
}
}
class SqliteCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SQLiteConnection";
}
}
class MssqlCodeGenerator : CodeGeneratorBase
{
public override string GetDbConnectionType()
{
return "SqlConnection";
}
}
Run Code Online (Sandbox Code Playgroud)另一方面,这是第二个问题的问题,如果你知道一个很好的替代方案来实现上述目标,那么无论如何......
为什么静态虚拟不可能?C#依赖还是在OO世界中没有任何意义?
我知道这个概念已被强调,但我没有找到上一个问题的简单答案.
据我所知C#,不支持虚拟静态属性.如何实现这样的行为C#?
我想归档基类的所有派生类必须覆盖静态属性.获取派生类型,我想访问一个名为的静态属性Identifier
Type t = typeof(DerivedClass);
var identifier= (String) t.GetProperty("Identifier", BindingFlags.Static).GetValue(null, null);
Run Code Online (Sandbox Code Playgroud) 有没有让基类在C#中使用派生类的静态变量?像这样的东西:
class Program
{
static void Main(string[] args)
{
int Result = DerivedClass.DoubleNumber();
Console.WriteLine(Result.ToString()); // Returns 0
}
}
class BaseClass
{
public static int MyNumber;
public static int DoubleNumber()
{
return (MyNumber*2);
}
}
class DerivedClass : BaseClass
{
public new static int MyNumber = 5;
}
Run Code Online (Sandbox Code Playgroud)
我试图让它返回10,但我得到0.
这里是我使用它的地方:我有一个名为ProfilePictures的类,它带有一个名为GetTempSavePath的静态函数,它将用户id作为参数,并返回临时文件的物理路径.路径库是一个名为TempPath的静态变量.由于我在多个项目中使用此类并且它们具有不同的TempPath,因此我创建了一个派生类,该变量将该变量设置为项目的路径.
在c#中,如何定义一个由所有派生/实现类型实现的静态方法?我知道你无法在界面中定义静态方法.
基本前提是这样的:
比方说,我有一个生物基类.衍生类型将是人类和狗.
我想要一种方法,可以回答我说给定生物体的腿数.所以人类将是2,狗将是4,等等.
我可以将这样的方法作为实例方法,但它没有多大意义,因为它对于所有Dog类型都是相同的方法,对所有Human类型都是相同的,等等.