在GCC上编译时,我得到错误:函数定义上的纯指定符,但是当我使用VS2005编译相同的代码时却没有.
class Dummy {
//error: pure-specifier on function-definition, VS2005 compiles
virtual void Process() = 0 {};
};
Run Code Online (Sandbox Code Playgroud)
但是当这个纯虚函数的定义不是内联时,它的工作原理是:
class Dummy
{
virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005
Run Code Online (Sandbox Code Playgroud)
错误意味着什么?为什么我不能内联?如第二个代码示例所示,避免编译问题是否合法?
这是我在Java中的测试程序.我想知道抽象类在这里有多重要,为什么我们为此使用抽象类.
它是强制性的还是最好的方法; 如果是这样的话?
class Shape1 {
int i = 1;
void draw() {
System.out.println("this is shape:" + i);
}
}
class Shape2 {
int i = 4;
void draw() {
System.out.println("this is shape2:" + i);
}
}
class Shape {
public static void main(String args[]) {
Shape1 s1 = new Shape1();
s1.draw();
Shape2 s2 = new Shape2();
s2.draw();
}
}
Run Code Online (Sandbox Code Playgroud) 在我看过的每个例子中,扩展类都实现了父类的接口.供参考,以下示例:
interface MyInterface{
public function foo();
public function bar();
}
abstract class MyAbstract implements MyInterface{
public function foo(){ /* stuff */ }
public function bar(){ /* stuff */ }
}
// what i usually see
class MyClass extends MyAbstract implements MyInterface{}
// what i'm curious about
class MyOtherClass extends MyAbstract{}
Run Code Online (Sandbox Code Playgroud)
是否未能在子级中实现接口,这是由父级实现的,被视为不良做法或其他什么?省略孩子的实施是否有任何技术缺陷?
虽然某些指导原则指出,当你想为继承不是明确的类定义合同时应该使用接口(IDomesticated),当类是另一个(Cat : Mammal,Snake : Reptile)的扩展时继承,有些情况(在我看来)这些准则进入灰色地带.
例如,说我的实施是Cat : Pet.Pet是一个抽象类.应该说是扩大到Cat : Mammal, IDomesticated那里Mammal是一个抽象类,IDomesticated是接口?或者我是否与KISS/YAGNI原则相冲突(尽管我不确定Wolf将来是否会有一个课程,但是无法继承Pet)?
远离隐喻Cats和Pets,假设我有一些表示传入数据源的类.他们都需要以某种方式实现相同的基础.我可以在抽象Source类中实现一些通用代码并从中继承.我也可以创建一个ISource接口(对我来说感觉更"正确")并在每个类中重新实现通用代码(这不太直观).最后,通过制作抽象类和界面,我可以"吃蛋糕并吃掉它".什么是最好的?
这两种情况提出了仅使用抽象类,只使用接口并同时使用抽象类和接口的要点.这些都是有效的选择,还是存在"规则",以便何时应该使用另一个?
我想通过"同时使用抽象类和接口"来澄清,当它们基本上表示相同的事物(Source并且ISource两者都具有相同的成员)时,包括这种情况,但是类在接口指定合同时添加了通用功能.
另外值得注意的是,这个问题主要针对不支持多重继承的语言(例如.NET和Java).
我已经阅读过Scala,通常建议使用Traits而不是Abstract类来扩展基类.
以下是一个很好的设计模式和布局吗?这是Traits如何取代Abstract?
我有一个只有静态方法和字段的java类,所以我不希望为此创建任何对象.我可以通过两种方式实现这一点,
哪两个更好的方式?
abstract class CustomControl : UserControl
{
protected abstract int DoStuff();
}
class DetailControl : CustomControl
{
protected override int DoStuff()
{
// do stuff
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我在表单中删除了一个DetailControl.它在运行时正确呈现,但设计器显示错误并且无法打开,因为基本用户控件是抽象的.
目前,我正在考虑以下补丁,这对我来说似乎很不对,因为我希望子类被强制实现该方法.
class CustomControl : UserControl
{
protected virtual int DoStuff()
{
throw new InvalidOperationException("This method must be overriden.");
}
}
class DetailControl : CustomControl
{
protected override int DoStuff()
{
// do stuff
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都有更好的想法如何解决这个问题?
使用"抽象方法"有什么意义?抽象类无法实例化,但抽象方法呢?他们只是在这里说"你必须实现我",如果我们忘记它们,编译器会抛出错误吗?
这是否意味着别的什么?我还读到了一些关于"我们不必重写相同代码"的内容,但在抽象类中,我们只"声明"抽象方法,因此我们必须重写子类中的代码.
你能帮我理解一下吗?我检查了关于"抽象类/方法"的其他主题,但我没有找到答案.
我知道Kotlin中抽象类和接口之间的两个区别:
var......)由于Kotlin是一种相当新鲜的语言,我想知道为什么抽象类没有被抛弃?接口似乎是优秀的工具,对Abstract Classes的需求很少.
详细说明:Kotlin确实支持接口中的具体功能实现,例如:
interface Shiny {
fun shine(amount : Int) // abstract function
fun reflect(s : String) { print ("**$s**") } // concrete function
}
Run Code Online (Sandbox Code Playgroud)
有人能提供一个强有力的实例来说明抽象类的需求吗?
abstract-class ×10
java ×3
oop ×3
c# ×2
interface ×2
.net ×1
abstract ×1
c++ ×1
inheritance ×1
kotlin ×1
php ×1
pure-virtual ×1
scala ×1
traits ×1
winforms ×1