如何在不重载纯虚函数的情况下将抽象 class 转换为普通 class?
how to convert abstract class to normal class without overload pure virtual function?
看下面的代码:
class A
{
public:
virtual int getN() = 0;
};
class B : public A
{
private:
int n = 2;
public:
int getN() { return n; }
};
class C : public A
{
// do not contain property n, it nolonger need getN();
};
classA是一个摘要class。现在我有 class C 派生自 A。但它不像 class B 有 属性 n。所以我不能重载getN()
,然后class C是一个抽象的class,我不能实例化它。
那么如果我想实例化class C,我该怎么办?
您可以尝试将 A
拆分为单独的接口,这样子 类 可以选择他们希望继承 A
的哪些属性。
以此为例:
class A
{
public:
virtual int getN() = 0;
};
class A1
{
public:
virtual int getNum() = 0;
};
class B : public A, public A1
{
private:
int n = 2;
public:
int getN() override { return n; }
int getNum() override { return 42; }
};
class C : public A1
{
public:
virtual int getNum() override { return 1; }
};
这里,C
不再需要getN()
,所以它只继承它需要的接口。这种模式通常称为 interface segregation principle.
继承表示 "kind-of" 关系。
因为 C
没有 getN()
方法,所以它不能是 "kind of" A
因为持有 A
引用的任何人都有期待 getN()
出席的权利。
他们有这个权利,因为你通过将 getN
放在 A
的 public 虚拟接口中声明了它。
故事的寓意 - 尽可能避免继承。更喜欢封装。
看下面的代码:
class A
{
public:
virtual int getN() = 0;
};
class B : public A
{
private:
int n = 2;
public:
int getN() { return n; }
};
class C : public A
{
// do not contain property n, it nolonger need getN();
};
classA是一个摘要class。现在我有 class C 派生自 A。但它不像 class B 有 属性 n。所以我不能重载getN()
,然后class C是一个抽象的class,我不能实例化它。
那么如果我想实例化class C,我该怎么办?
您可以尝试将 A
拆分为单独的接口,这样子 类 可以选择他们希望继承 A
的哪些属性。
以此为例:
class A
{
public:
virtual int getN() = 0;
};
class A1
{
public:
virtual int getNum() = 0;
};
class B : public A, public A1
{
private:
int n = 2;
public:
int getN() override { return n; }
int getNum() override { return 42; }
};
class C : public A1
{
public:
virtual int getNum() override { return 1; }
};
这里,C
不再需要getN()
,所以它只继承它需要的接口。这种模式通常称为 interface segregation principle.
继承表示 "kind-of" 关系。
因为 C
没有 getN()
方法,所以它不能是 "kind of" A
因为持有 A
引用的任何人都有期待 getN()
出席的权利。
他们有这个权利,因为你通过将 getN
放在 A
的 public 虚拟接口中声明了它。
故事的寓意 - 尽可能避免继承。更喜欢封装。