花了很长时间在C#中开发,我注意到如果为了将它用作接口而声明一个抽象类,则无法实例化该抽象类的向量来存储子类的实例.
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class IFunnyInterface
{
public:
virtual void IamFunny() = 0;
};
class FunnyImpl: IFunnyInterface
{
public:
virtual void IamFunny()
{
cout << "<INSERT JOKE HERE>";
}
};
class FunnyContainer
{
private:
std::vector <IFunnyInterface> funnyItems;
};
Run Code Online (Sandbox Code Playgroud)
声明抽象类向量的行在MS VS2005中导致此错误:
error C2259: 'IFunnyInterface' : cannot instantiate abstract class
Run Code Online (Sandbox Code Playgroud)
我看到一个明显的解决方法,即用以下内容替换IFunnyInterface:
class IFunnyInterface
{
public:
virtual void IamFunny()
{
throw new std::exception("not implemented");
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个可接受的解决方案C++明智吗?如果没有,是否有像boost这样的第三方库可以帮我解决这个问题?
谢谢您阅读此篇 !
安东尼
有人可以向我解释抽象类,接口和mixins之间的区别吗?我之前在我的代码中使用了每个,但我不知道技术差异.
虽然映射类我得到错误'T'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法中将其用作参数'T'.
下面是我的SqlReaderBase类
public abstract class SqlReaderBase<T> : ConnectionProvider
{
#region Abstract Methods
protected abstract string commandText { get; }
protected abstract CommandType commandType { get; }
protected abstract Collection<IDataParameter> GetParameters(IDbCommand command);
**protected abstract MapperBase<T> GetMapper();**
#endregion
#region Non Abstract Methods
/// <summary>
/// Method to Execute Select Queries for Retrieveing List of Result
/// </summary>
/// <returns></returns>
public Collection<T> ExecuteReader()
{
//Collection of Type on which Template is applied
Collection<T> collection = new Collection<T>();
// initializing connection
using (IDbConnection connection …Run Code Online (Sandbox Code Playgroud) 我正在尝试定义一个实现Comparable的抽象类.当我使用以下定义定义类时:
public abstract class MyClass implements Comparable <MyClass>
Run Code Online (Sandbox Code Playgroud)
子类必须实现compareTo(MyClass object).相反,我希望每个子类都能实现compareTo(SubClass object),接受自己类型的对象.当我尝试使用以下内容定义抽象类时:
public abstract class MyClass implements Comparable <? extends MyClass>
Run Code Online (Sandbox Code Playgroud)
它抱怨说"超类型可能没有指定任何通配符".
有解决方案吗?
在java中,如果一个类实现Serializable但是是抽象的,它是否应该声明一个longVersionUID,或者子类只需要它?
在这种情况下,确实意图是所有子类都处理序列化,因为该类型的目的是在RMI调用中使用.
举个例子:
abstract class Base {
function __construct() {
echo 'Base __construct<br/>';
}
}
class Child extends Base {
function __construct() {
echo 'Child __construct<br/>';
}
}
$c = new Child();
Run Code Online (Sandbox Code Playgroud)
来自C#背景,我希望输出为
Base __construct
Child __construct
但是,实际输出只是
孩子__construct
如果已经提出这个问题,我道歉.我搜索了一些问题但找不到答案.
在Java中,我可以在抽象类中获取扩展它的具体类的实例吗?
如果是这样,我可以看一个代码示例吗?
我正在创建一个抽象类.我希望每个派生类都被强制实现构造函数的特定签名.因此,我做了我想做的事情,我想强制他们实现一个方法,我做了一个抽象的方法.
public abstract class A
{
abstract A(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一条消息,说明这个项目的抽象修饰符无效.我的目标是强制这样的代码.
public class B : A
{
public B(int a, int b) : base(a, b)
{
//Some other awesome code.
}
}
Run Code Online (Sandbox Code Playgroud)
这是所有C#.NET代码.谁能帮我吗?
更新1
我想补充一些东西.我最终得到的是这个.
private A() { }
protected A(int a, int b)
{
//Code
}
Run Code Online (Sandbox Code Playgroud)
这就是一些人所说的,默认是私有的,并且类需要实现构造函数.但是,这不会强制带有签名A(int a,int b)的构造函数.
public abstract class A
{
protected abstract A(int a, int b)
{
}
}
Run Code Online (Sandbox Code Playgroud)
更新2
我应该清楚,为了解决这个问题,我将默认构造函数设为私有,并保护我的其他构造函数.我并不是在寻找一种让我的代码工作的方法.我照顾好了.我想了解为什么C#不允许你这样做.
abstract-class ×10
java ×4
c# ×3
interface ×2
oop ×2
.net ×1
c++ ×1
constructor ×1
generics ×1
inheritance ×1
java-8 ×1
mapping ×1
mixins ×1
php ×1
stl ×1
terminology ×1