抽象函数和虚函数有什么区别?在哪些情况下建议使用虚拟或抽象?哪一个是最好的方法?
采访者问:我们可以实例化一个抽象类吗?我说,不,他告诉我 - 错,我们可以.
我对此有点争论.然后他告诉我自己在家里试试.
abstract class my {
public void mymethod() {
System.out.print("Abstract");
}
}
class poly {
public static void main(String a[]) {
my m = new my() {};
m.mymethod();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我正在创建我的类的实例并调用抽象类的方法.有人可以向我解释一下吗?在我的采访中我真的错了吗?
如何在Python中创建类或方法摘要?
我试着__new__()
像这样重新定义:
class F:
def __new__(cls):
raise Exception("Unable to create an instance of abstract class %s" %cls)
Run Code Online (Sandbox Code Playgroud)
但是现在如果我创建一个G
继承自F
这样的类:
class G(F):
pass
Run Code Online (Sandbox Code Playgroud)
然后我也无法实例化G
,因为它调用了它的超类__new__
方法.
有没有更好的方法来定义抽象类?
我在使用Python继承时遇到了麻烦.虽然这个概念在Java中对我来说似乎太容易了但到目前为止我一直无法理解Python,至少对我来说这是令人惊讶的.
我有一个原型如下:
class Shape():
def __init__(self, shape_name):
self.shape = shape_name
class Rectangle(Shape):
def __init__(self, name):
self.shape = name
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我如何制作一个需要为所有子类实现的抽象方法?
考虑一个例子(在java中编译)
public abstract interface Interface {
public void interfacing();
public abstract boolean interfacing(boolean really);
}
Run Code Online (Sandbox Code Playgroud)
为什么接口被"声明"抽象是必要的?是否有适用于抽象接口的其他规则?
最后:如果abstract
已经过时,为什么它包含在Java中?抽象界面有历史吗?
我正在通过Jar文件中的类进行交互,并希望找到那些不是抽象的.我可以通过实例化类和捕获InstantiationException来解决这个问题,但由于某些类具有大量启动,因此性能受到影响.我在Class.java文档中找不到任何明显像isAbstract()的东西.
我今天使用Eclipse的"拉接口"重构功能来创建基于现有类的接口.提供的对话框用于创建新接口的所有新方法作为"抽象"方法.
那有什么好处?
我认为你被允许将接口方法声明为抽象的这一事实是该语言的一个多余且无害的特性,并不特别鼓励.
为什么Eclipse会支持这样的风格,或者为什么有人会自愿选择这样做呢?
澄清:我不是在问为什么界面方法是抽象的,这很明显.我在问为什么会明确地选择将它们标记为抽象,因为如果它们在界面中它们仍然是抽象的.
数据类似乎是Java中旧式POJO的替代品.很可能这些类允许继承,但我看不到扩展数据类的方便方法.我需要的是这样的:
open data class Resource (var id: Long = 0, var location: String = "")
data class Book (var isbn: String) : Resource()
Run Code Online (Sandbox Code Playgroud)
由于component1()
方法的冲突,上面的代码失败了.data
仅在一个类中留下注释也不起作用.
也许还有另一个成语来扩展数据类?
UPD:我可能只注释子子类,但data
注释只处理构造函数中声明的属性.也就是说,我必须声明所有父级的属性open
并覆盖它们,这很难看:
open class Resource (open var id: Long = 0, open var location: String = "")
data class Book (
override var id: Long = 0,
override var location: String = "",
var isbn: String
) : Resource()
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中不应该有一个抽象的静态函数?
接口中的C#方法在不使用virtual
关键字的情况下声明,并在派生类中重写而不使用override
关键字.
是否有一个原因?我认为它只是一种语言方便,显然CLR知道如何处理这个问题(默认情况下方法不是虚拟的),但还有其他技术原因吗?
以下是派生类生成的IL:
class Example : IDisposable {
public void Dispose() { }
}
.method public hidebysig newslot virtual final
instance void Dispose() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Example::Dispose
Run Code Online (Sandbox Code Playgroud)
请注意,该方法virtual
final
在IL中声明.