问题是在Java中为什么我不能定义一个抽象的静态方法?例如
abstract class foo {
abstract void bar( ); // <-- this is ok
abstract static void bar2(); //<-- this isn't why?
}
Run Code Online (Sandbox Code Playgroud) 在PHP 5.2中启用严格警告后,我看到一个项目的严格标准警告,这些警告最初是在没有严格警告的情况下编写的:
严格标准:静态函数 Program :: getSelectSQL()在Program.class.inc中不应该是抽象的
有问题的函数属于抽象父类Program,并被声明为abstract static,因为它应该在其子类中实现,例如TVProgram.
我确实在这里找到了对此更改的引用:
删除了抽象的静态类函数.由于疏忽,PHP 5.0.x和5.1.x允许在类中使用抽象静态函数.从PHP 5.2.x开始,只有接口才能拥有它们.
我的问题是:有人可以清楚地解释为什么在PHP中不应该有一个抽象的静态函数?
我有一个辅助类,它只是一堆静态方法,并且想要辅助类的子类.某些行为是独特的,具体取决于子类,所以我想从基类调用虚方法,但由于所有方法都是静态的,我无法创建普通的虚方法(需要对象引用才能访问虚方法).
有没有办法解决?我想我可以使用单例.. 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世界中没有任何意义?
我知道这个概念已被强调,但我没有找到上一个问题的简单答案.
我想要做的就是确保类Item的子类实现静态方法,并且我希望在编译时检查它以避免运行时错误.
使用静态方法的抽象类似乎不起作用:
错误:无法将静态成员标记为覆盖,虚拟或抽象
public abstract class Item
{
public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime);
}
public class Customer : Item
{
public static override Customer GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Customer();
}
}
public class Address : Item
{
public static override Address GetHistoricalItem(int id, DateTime pastDateTime)
{
return new Address();
}
}
Run Code Online (Sandbox Code Playgroud)
和接口似乎也不起作用:
错误:客户未实现接口成员GetHistoricalItem()
public class Customer : Item, HistoricalItem
{
public static Customer GetHistoricalItem(int id, DateTime pastDateTime)
{ …Run Code Online (Sandbox Code Playgroud) 我遇到了一个有趣的问题,我正在寻找一些关于如何最好地处理这个问题的建议......
我有一个抽象类,其中包含一个静态方法,该方法接受我想要定义为抽象属性的静态字符串.问题是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个类,这是一个维护噩梦.
使用PHP v5.3中的后期静态绑定,可以static在接口中有用地声明方法; 对于PHP v5.4中的特征,方法可以是static或abstract但不是两者.这似乎是不合逻辑和不一致的.
特别地,假设一个具有特征提供所有实现的接口,静态方法除外; 除非在特征中声明了该方法,否则静态分析器会对特征内的任何引用进行跟踪.但是,在特征中提供具体实现不再强制实现/使用类来提供自己的实现 - 这是危险的; abstract static会是理想的,但不允许.
这个矛盾的解释是什么?你会如何建议解决这个问题?
interface MyInterface
{
public static function getSetting();
public function doSomethingWithSetting();
}
trait MyTrait
{
public abstract static function getSetting(); // I want this...
public function doSomethingWithSetting() {
$setting = static::getSetting(); // ...so that I can do this
/* ... */
}
}
class MyClass implements MyInterface
{
use MyTrait;
public static function getSetting() { return /* ... */ }
}
Run Code Online (Sandbox Code Playgroud) 我想做以下事情
public abstract class MyAbstractClass
{
public static abstract int MagicId
{
get;
}
public static void DoSomeMagic()
{
// Need to get the MagicId value defined in the concrete implementation
}
}
public class MyConcreteClass : MyAbstractClass
{
public static override int MagicId
{
get { return 123; }
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不能因为你不能拥有静态抽象成员.
我理解为什么我不能这样做 - 对设计的任何建议都能达到同样的效果?
(为了清楚起见 - 我试图提供一个带有抽象基类的库,但是具体的版本必须自己实现一些属性/方法,是的,有充分的理由让它保持静态.)
我目前正在为二进制应用程序协议开发库.以下代码示例无法编译(抽象类型中不允许使用静态方法定义.太糟糕了:(),但显示了我的意图:
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) 据我所知C#,不支持虚拟静态属性.如何实现这样的行为C#?
我想归档基类的所有派生类必须覆盖静态属性.获取派生类型,我想访问一个名为的静态属性Identifier
Type t = typeof(DerivedClass);
var identifier= (String) t.GetProperty("Identifier", BindingFlags.Static).GetValue(null, null);
Run Code Online (Sandbox Code Playgroud)