相关疑难解决方法(0)

为什么静态方法在Java中不能是抽象的

问题是在Java中为什么我不能定义一个抽象的静态方法?例如

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}
Run Code Online (Sandbox Code Playgroud)

java abstract-class static-methods

572
推荐指数
8
解决办法
26万
查看次数

为什么PHP 5.2+禁止抽象静态类方法?

在PHP 5.2中启用严格警告后,我看到一个项目的严格标准警告,这些警告最初是在没有严格警告的情况下编写的:

严格标准:静态函数 Program :: getSelectSQL()在Program.class.inc中不应该是抽象

有问题的函数属于抽象父类Program,并被声明为abstract static,因为它应该在其子类中实现,例如TVProgram.

我确实在这里找到了对此更改的引用:

删除了抽象的静态类函数.由于疏忽,PHP 5.0.x和5.1.x允许在类中使用抽象静态函数.从PHP 5.2.x开始,只有接口才能拥有它们.

我的问题是:有人可以清楚地解释为什么在PHP中不应该有一个抽象的静态函数?

php oop static abstract

120
推荐指数
4
解决办法
6万
查看次数

为什么我不能声明C#方法虚拟和静态?

我有一个辅助类,它只是一堆静态方法,并且想要辅助类的子类.某些行为是独特的,具体取决于子类,所以我想从基类调用虚方法,但由于所有方法都是静态的,我无法创建普通的虚方法(需要对象引用才能访问虚方法).

有没有办法解决?我想我可以使用单例.. HelperClass.Instance.HelperMethod()并不比HelperClass.HelperMethod()差.布朗尼指出任何可以指出支持虚拟静态方法的语言的人.

编辑:好的,我疯了.谷歌搜索结果让我觉得我不是那里的.

c# oop

50
推荐指数
7
解决办法
5万
查看次数

C#,像方法一样实现'静态抽象'

我最近遇到了一个问题,似乎我需要一个'静态抽象'方法.我知道为什么这是不可能的,但我怎样才能解决这个限制?

例如,我有一个抽象类,它有一个描述字符串.由于此字符串对于所有实例都是通用的,因此它被标记为static,但我想要求从此类派生的所有类都提供它们自己的Description属性,因此我将其标记为abstract:

abstract class AbstractBase
{
    ...
    public static abstract string Description{get;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

它当然不会编译.我想过使用接口但接口可能不包含静态方法签名.

我应该简单地使它成为非静态的,并且总是得到一个实例来获取特定于类的信息吗?

有任何想法吗?

c# static abstract

41
推荐指数
4
解决办法
3万
查看次数

C#虚拟静态方法

为什么静态虚拟不可能?C#依赖还是在OO世界中没有任何意义?

我知道这个概念已被强调,但我没有找到上一个问题的简单答案.

c# generics methods virtual static

31
推荐指数
5
解决办法
2万
查看次数

如何强制继承类在C#中实现静态方法?

我想要做的就是确保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# methods static interface abstract

20
推荐指数
3
解决办法
1万
查看次数

无法定义静态抽象字符串属性

我遇到了一个有趣的问题,我正在寻找一些关于如何最好地处理这个问题的建议......

我有一个抽象类,其中包含一个静态方法,该方法接受我想要定义为抽象属性的静态字符串.问题是C#不支持以下内容(请参阅ConfigurationSectionNameCurrent属性):

    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!

.net c#

14
推荐指数
1
解决办法
1万
查看次数

C#虚拟(或抽象)静态方法

静态继承就像实例继承一样工作.除非您不允许将静态方法设为虚拟或抽象.

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# inheritance

12
推荐指数
2
解决办法
1万
查看次数

为什么PHP特征不能有静态抽象方法?

使用PHP v5.3中的后期静态绑定,可以static在接口中有用地声明方法; 对于PHP v5.4中的特征,方法可以是staticabstract但不是两者.这似乎是不合逻辑和不一致的.

特别地,假设一个具有特征提供所有实现的接口,静态方法除外; 除非在特征中声明了该方法,否则静态分析器会对特征内的任何引用进行跟踪.但是,在特征中提供具体实现不再强制实现/使用类来提供自己的实现 - 这是危险的; 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)

php oop static traits abstract

12
推荐指数
1
解决办法
2218
查看次数

C#类设计 - 我可以使用什么而不是"静态抽象"?

我想做以下事情

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)

但是我不能因为你不能拥有静态抽象成员.

我理解为什么我不能这样做 - 对设计的任何建议都能达到同样的效果?

(为了清楚起见 - 我试图提供一个带有抽象基类的库,但是具体的版本必须自己实现一些属性/方法,是的,有充分的理由让它保持静态.)

c# design-patterns

9
推荐指数
2
解决办法
533
查看次数

无法在抽象类型中定义静态方法.如何工作?

我目前正在为二进制应用程序协议开发库.以下代码示例无法编译(抽象类型中不允许使用静态方法定义.太糟糕了:(),但显示了我的意图:

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#

9
推荐指数
1
解决办法
2670
查看次数

如何实现虚拟静态属性?

据我所知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# virtual static properties

9
推荐指数
2
解决办法
1万
查看次数