我怎样才能很好地在AS3中创建一个抽象类?
我试过这个:
public class AnAbstractClass
{
public function toBeImplemented():void
{
throw new NotImplementedError(); // I've created this error
}
}
public class AnConcreteClass extends AnAbstractClass
{
override public function toBeImplemented():void
{
// implementation...
}
}
Run Code Online (Sandbox Code Playgroud)
但是......我不喜欢这样.并且没有编译时错误.
我最近在PHP中遇到了Traits,我正试图理解它们.在我的研究期间,我偶然发现了Stack Overflow这个问题:Traits vs. Interfaces.接受的答案提到以下内容:
接口定义了实现类必须实现的一组方法.
当使用特征时,方法的实现也会出现 - 这在接口中不会发生.
到目前为止这么好,但这听起来就像接口和抽象类之间的区别.所以这为我提出了一个后续问题:
我知道我只能从一个抽象类扩展,另一方面可以使用任何数量的特征.但这真的是唯一的区别吗?我仍然不完全了解特征及其用途.
接口+扩展方法(mixin)是否优于抽象类?
如果你的答案是"它取决于",它依赖于什么?
我看到接口+扩展方法有两个可能的优点.
我还没有想到这种方法的缺点.接口+扩展方法失败可能有一个明显的简单原因.
关于这个主题的两篇有用的文章是
如果抽象类中的公共构造函数只能由其派生类调用,那么它应该在功能上等同于受保护的构造函数.对?
在抽象类中声明公共构造函数而不是受保护构造函数有什么区别吗?你会用它做什么用的?为什么编译器没有投诉?
我有这个C#代码:
abstract class MyList : IEnumerable<T>
{
public abstract IEnumerator<T> GetEnumerator();
//abstract IEnumerator IEnumerable.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
就是这样,我得到:
'Type'没有实现接口成员'System.Collections.IEnumerable.GetEnumerator()'.
删除评论,我得到:
修饰符'abstract'对此项无效
如何制作显式实现摘要
我的Python应用程序包含许多抽象类和实现.例如:
import abc
import datetime
class MessageDisplay(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def display(self, message):
pass
class FriendlyMessageDisplay(MessageDisplay):
def greet(self):
hour = datetime.datetime.now().timetuple().tm_hour
if hour < 7:
raise Exception("Cannot greet while asleep.")
elif hour < 12:
self.display("Good morning!")
elif hour < 18:
self.display("Good afternoon!")
elif hour < 20:
self.display("Good evening!")
else:
self.display("Good night.")
class FriendlyMessagePrinter(FriendlyMessageDisplay):
def display(self, message):
print(message)
Run Code Online (Sandbox Code Playgroud)
FriendlyMessagePrinter 是一个我们可以使用的具体类......
FriendlyMessagePrinter().greet()
Run Code Online (Sandbox Code Playgroud)
Good night.
Run Code Online (Sandbox Code Playgroud)
...但是MessageDisplay并且FriendlyMessageDisplay是抽象类并且尝试实例化一个会导致错误:
TypeError: Can't instantiate abstract class MessageDisplay with abstract methods say
Run Code Online (Sandbox Code Playgroud)
如何检查给定的类对象是否是(不可实例化的)抽象类?
我正在研究Java 8接口中的新虚拟扩展方法:
public interface MyInterface {
default String myMethod() {
return "myImplementation";
}
}
Run Code Online (Sandbox Code Playgroud)
我的目的是允许接口随着时间的推移而发展,以及多重继承位,但它们看起来非常像我的抽象类.
如果你正在做新的工作,抽象类优先于扩展方法来提供"接口"的实现,还是这两种方法在概念上是等价的?
我试图A用一个默认行为的构造函数声明一个抽象类:所有子类必须初始化一个成员self.n:
from abc import ABCMeta
class A(object):
__metaclass__ = ABCMeta
def __init__(self, n):
self.n = n
Run Code Online (Sandbox Code Playgroud)
但是,我不想让A类被实例化,因为它是一个抽象类.问题是,这实际上是允许的:
a = A(3)
Run Code Online (Sandbox Code Playgroud)
当我期望它应该时,这不会产生任何错误.
那么:如何在为构造函数定义默认行为时定义不可实例化的抽象类?
我有一些Java经验,现在正在做C++课程.我想尝试编写一个界面,但是我遇到了一些我无法解决的析构函数问题,即使是在Internet上的帮助......这是我的代码:
class Force {
public:
virtual ~Force();
virtual VECTOR eval(VECTOR x, double t);
};
class InvSquare : public Force {
public:
InvSquare(double A) {
c = A;
}
~InvSquare(){};
VECTOR eval(VECTOR x, double t) { // omitted stuff }
private:
double c;
};
Run Code Online (Sandbox Code Playgroud)
我试图为基类声明一个虚拟析构函数,并为派生类声明一个非虚函数,但是我得到一个错误,说"未定义引用`Force :: ~Force()'".它是什么意思,我该如何解决?
如果这是一个愚蠢的问题,请原谅我!
非常感谢你的帮助,noctilux
abstract-class ×10
interface ×4
c# ×2
java ×2
oop ×2
python ×2
.net ×1
abc ×1
c++ ×1
constructor ×1
java-8 ×1
php ×1
python-2.7 ×1
traits ×1