I get that but how would the difference in implementation look? Ill give an example. Ive made 1 superclass called Asset and 3 subclasses which derive from Asset and they are called Stock, Bond and Saving. I made 5 instances of stocks, bonds and savings and threw them in a container class called AssetList. The interface and implementation are shown below. Note that I used the Qt framework and so some data structures are not part of the standard library. Please note that according to my understanding the below is a COMPOSITE setup. What would I need to tweak to make it an AGGREGATION?:
Code:
#ifndef ASSET_H
#define ASSET_H
#include <QString>
#include <QDate>
class Asset
{
public:
Asset(QString des, QDate dat);
virtual double value() = 0;
QString getDescription();
QString getType();
protected:
QString type;
QDate date;
private:
QString description;
};
#endif // ASSET_H
Code:
#include "asset.h"
Asset::Asset(QString des, QDate dat) : description(des), date(dat){
}
QString Asset::getDescription(){
return description;
}
QString Asset::getType(){
return type;
}
Code:
#ifndef STOCK_H
#define STOCK_H
#include "asset.h"
#include <QString>
#include <QDate>
class Stock : public Asset
{
public:
Stock(QString des, QDate dat, int nsh, double spr);
double value();
void setPrice(double np);
private:
int numShares;
double sharePrice;
};
#endif // STOCK_H
Code:
#include "stock.h"
Stock::Stock(QString des, QDate dat, int nsh, double spr) : Asset(des, dat), numShares(nsh), sharePrice(spr){
type = "Stock";
}
double Stock::value(){
return sharePrice * numShares;
}
void Stock::setPrice(double np){
sharePrice = np;
}
Code:
#ifndef BOND_H
#define BOND_H
#include "asset.h"
class Bond : public Asset
{
public:
Bond(QString des, QDate dat, double fva, double yield);
double value();
private:
double faceValue;
double yield;
};
#endif // BOND_H
Code:
#include "bond.h"
#include <QDate>
#include <QDebug>
Bond::Bond(QString des, QDate dat, double fva, double yie) : Asset(des, dat), faceValue(fva), yield(yie){
type = "Bond";
}
double Bond::value(){
int bondYears =QDate::currentDate().year() - date.year();
double faceValue = this -> faceValue;
double interestEarned = (yield/100) * bondYears * faceValue;
double value = faceValue + interestEarned;
//qDebug() << "bond value is: " ;
return value;
}
Code:
#ifndef SAVING_H
#define SAVING_H
#include "asset.h"
class Saving : public Asset
{
public:
Saving(QString des, QDate dat, double cva, double ira);
double value();
void changeValue(double amount);
void addInterest();
private:
double currentValue;
double interestRate;
};
#endif // SAVING_H
Code:
#include "saving.h"
#include <QDebug>
Saving::Saving(QString des, QDate dat, double cva, double ira) : Asset(des, dat), currentValue(cva), interestRate(ira){
type = "Saving";
}
double Saving::value(){
return currentValue;
}
void Saving::changeValue(double amount){
currentValue += amount;
}
void Saving::addInterest(){
currentValue *= (1 + interestRate/100);
}
Code:
#ifndef ASSETLIST_H
#define ASSETLIST_H
#include <QList>
#include "asset.h"
class AssetList : public QList<Asset*>
{
public:
AssetList();
bool addAsset(Asset* a);
Asset* findAsset(QString des);
double totalValue(QString typ);
private:
QList <Asset*> listOfAssets;
};
#endif // ASSETLIST_H
Code:
#include "assetlist.h"
#include <iostream>
using namespace std;
AssetList::AssetList(){
}
bool AssetList::addAsset(Asset* a){
if(!listOfAssets.contains(a)){
listOfAssets.append(a);
return true;
}
cout << "Asset is a duplicate. Asset is not added to the asset list" << endl;
return false;
}
Asset* AssetList::findAsset(QString des){
for(Asset *iterator : listOfAssets){
if((*iterator).getDescription() == des){
return iterator;
}
}
return NULL;
}
double AssetList::totalValue(QString typ){
double sumValue = 0;
for(Asset *iterator : listOfAssets){
if(typ == iterator->getType()){
sumValue += iterator->value();
}
}
return sumValue;
}