设计一个类,该类不能被继承,且只能实例化3次

本文介绍了一个设计模式,用于创建一个类,该类不能被继承,并且最多只能实例化三次。通过静态成员变量和特殊构造方法实现限制实例化次数的功能。
设计一个类,该类不能被继承,且只能实例化3次

直接来程序了~
#include<iostream>

class finalclass
{
public: static int count;
public:
	static finalclass *getinstance()
	{
		if(count <= 0)
			return NULL;
		count--;
		return new finalclass;
	}
	static void setcount(int n)
	{
		count = n;
	}
/*	static void deleteinstance(finalclass *pinstance)
	{
		delete pinstance;
		pinstance = 0;
	}
*/
private:
	finalclass(){}
	~finalclass(){}
};
int finalclass::count = 0;
int main()
{
	finalclass::setcount(3);
	finalclass *f1 = finalclass::getinstance();
	finalclass *f2 = finalclass::getinstance();
	finalclass *f3 = finalclass::getinstance();
	if(f3 == NULL)
		printf("f3 NULL\n");
	else
		printf("f3 NOT NULL\n");
	finalclass *f4 = finalclass::getinstance();
	if(f4 == NULL)
		printf("f4 NULL\n");
	finalclass *f5 = finalclass::getinstance();
	if(f5 == NULL)
		printf("f5 NULL\n");
}


### 抽象的定义与特性 抽象是一种使用 `abstract` 关键字声明的,其主要目的是提供一个通用模板,供子继承并实现具体的逻辑[^1]。抽象可以包含普通方法、抽象方法、成员变量和常量等[^2]。抽象方法是没有具体实现的方法,必须由子进行重写以提供具体的功能实现[^3]。 抽象本身不能实例化,即无法直接通过 `new` 关键字创建抽象的对象[^5]。然而,抽象可以通过子继承的方式间接使用。子继承抽象时,必须实现所有的抽象方法,否则该子也必须声明为抽象[^2]。 以下是一个简单的代码示例,展示抽象的定义和用法: ```java abstract class Animal { private String name; // 抽象方法 public abstract void run(); // 普通方法 public void eat() { System.out.println("动物在吃东西..."); run(); // 调用抽象方法 } } class Pig extends Animal { @Override public void run() { System.out.println("猪猪四条腿跑!"); } } public class Test { public static void main(String[] args) { Animal pig = new Pig(); pig.eat(); // 输出:动物在吃东西... 猪猪四条腿跑! } } ``` ### 抽象是否可以实例化 抽象不能直接实例化,任何尝试对抽象进行实例化的操作都会导致编译错误[^5]。例如,以下代码会导致编译失败: ```java Animal animal = new Animal(); // 编译错误,因为 Animal 是抽象 ``` ### 抽象继承特性 抽象可以通过继承来扩展功能。子继承抽象后,可以选择性地实现部分或全部的抽象方法。如果子没有实现所有抽象方法,则该子也必须声明为抽象。此外,抽象中的构造方法不能用于实例化对象,而是用于被子调用。 以下是关于抽象继承一个示例: ```java abstract class AbstractPoint { public AbstractPoint() { System.out.println("AbstractPoint 构造方法被调用"); } public abstract void display(); } class ConcretePoint extends AbstractPoint { public ConcretePoint() { super(); // 调用父构造方法 } @Override public void display() { System.out.println("ConcretePoint 的 display 方法被调用"); } } public class Test { public static void main(String[] args) { AbstractPoint point = new ConcretePoint(); // 实例化 point.display(); // 输出:ConcretePoint 的 display 方法被调用 } } ``` ### 抽象中的方法实现 值得注意的是,抽象中的抽象方法可以具有默认实现。即使提供了默认实现,子仍然需要重写该方法以满足设计需求[^4]。这种机制允许在抽象方法中提供一些基础功能,同时让子能够进一步扩展和丰富这些功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值