From 0496e27e97e723c5a4e8afd4a775ed0a813d1164 Mon Sep 17 00:00:00 2001 From: Spencer Smith <smiths@mcmaster.ca> Date: Wed, 14 Mar 2018 00:37:28 -0400 Subject: [PATCH] Updates to L27 Spec using UML - strategy design pattern etc --- .../DataSetInterface/bin/experiment | Bin 15052 -> 15852 bytes .../DataSetInterface/experimentation/main.cpp | 35 +++++++++--- .../DataSetInterface/include/BankAccount.h | 24 ++++++++ .../include/DataSetInterface.h | 6 +- .../DataSetInterface/src/BankAccount.cpp | 34 +++++++++++ .../DataSetInterface/src/DataSetInterface.cpp | 4 +- .../DataSetMultipleInheritance/Makefile | 53 ++++++++++++++++++ .../DataSetMultipleInheritance/bin/.gitkeep | 0 .../DataSetMultipleInheritance/bin/experiment | Bin 0 -> 15452 bytes .../experimentation/main.cpp | 31 ++++++++++ .../include/DataSetInterface.h | 20 +++++++ .../include/Measurable.h | 10 ++++ .../include/PointMT.h | 14 +++++ .../include/PointT.h | 21 +++++++ .../src/DataSetInterface.cpp | 26 +++++++++ .../src/PointMT.cpp | 11 ++++ .../DataSetMultipleInheritance/src/PointT.cpp | 38 +++++++++++++ .../L27_SpecViaUML/DataSetsAggregation.pdf | Bin 0 -> 14507 bytes .../L27_SpecViaUML/DataSetsAggregation.xml | 1 + .../L27_SpecViaUML/MeasurableInterface.pdf | Bin 0 -> 15728 bytes .../L27_SpecViaUML/MeasurableInterface.xml | 1 + .../MeasurableInterfaceInheritance.pdf | Bin 0 -> 17031 bytes .../MeasurableInterfaceInheritance.xml | 1 + .../L27_SpecViaUML/src/DataSetInterface.java | 4 +- 24 files changed, 319 insertions(+), 15 deletions(-) create mode 100644 Lectures/L27_SpecViaUML/DataSetInterface/include/BankAccount.h create mode 100644 Lectures/L27_SpecViaUML/DataSetInterface/src/BankAccount.cpp create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/Makefile create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/.gitkeep create mode 100755 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/experiment create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/experimentation/main.cpp create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/DataSetInterface.h create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/Measurable.h create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointMT.h create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointT.h create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/DataSetInterface.cpp create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointMT.cpp create mode 100644 Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointT.cpp create mode 100644 Lectures/L27_SpecViaUML/DataSetsAggregation.pdf create mode 100644 Lectures/L27_SpecViaUML/DataSetsAggregation.xml create mode 100644 Lectures/L27_SpecViaUML/MeasurableInterface.pdf create mode 100644 Lectures/L27_SpecViaUML/MeasurableInterface.xml create mode 100644 Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.pdf create mode 100644 Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.xml diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/bin/experiment b/Lectures/L27_SpecViaUML/DataSetInterface/bin/experiment index 0c43baf47bd779116b67b8d70b9304773e5e2853..e1e8c00d74884768128abb8a40ccd58f9e5e95ba 100755 GIT binary patch literal 15852 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 Kb_U1vaQ!dt7lobx delta 3098 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 diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/experimentation/main.cpp b/Lectures/L27_SpecViaUML/DataSetInterface/experimentation/main.cpp index 324358ba..362986cb 100644 --- a/Lectures/L27_SpecViaUML/DataSetInterface/experimentation/main.cpp +++ b/Lectures/L27_SpecViaUML/DataSetInterface/experimentation/main.cpp @@ -1,4 +1,5 @@ #include "PointT.h" +#include "BankAccount.h" #include "DataSetInterface.h" #include <iostream> @@ -7,12 +8,13 @@ using namespace std; int main() { - DataSetInterface ds; + //Test Data Set Inteface with PointT PointT p1(0.0, 0.0); PointT p2(3.0, 4.0); PointT p3(7.0, 24.0); PointT p4(5.0, 12.0); - + + DataSetInterface ds; ds.add(&p1); ds.add(&p2); ds.add(&p3); @@ -20,13 +22,30 @@ int main() cout << "average = " << ds.getAverage() << "\n"; - Measurable* maxM = ds.getMaximum(); + Measurable *maxM = ds.getMaximum(); - PointT* maxP = (PointT*) maxM; + PointT *maxP = (PointT*) maxM; + + cout << "maximum = " << *maxP << "\n"; + + //Test Data Set Inteface with Bank Account + + BankAccount b1; + b1.deposit(300); + BankAccount b2; + b2.deposit(100); + + DataSetInterface dsBank; + dsBank.add(&b1); + dsBank.add(&b2); + + cout << "average = " << dsBank.getAverage() << "\n"; + + maxM = dsBank.getMaximum(); + + BankAccount *maxB = (BankAccount*) maxM; + + cout << "maximum = " << *maxB << "\n"; - //maxP = dynamic_cast<PointT*>(maxM); - - cout << "maximum = " << maxP << "\n"; - return 0; } diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/include/BankAccount.h b/Lectures/L27_SpecViaUML/DataSetInterface/include/BankAccount.h new file mode 100644 index 00000000..70a52a48 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetInterface/include/BankAccount.h @@ -0,0 +1,24 @@ +#ifndef BANKACCOUNT_H +#define BANKACCOUNT_H + +#include "Measurable.h" + +#include <iostream> + +class BankAccount : public Measurable +{ + public: + BankAccount(); + void deposit(double amount); + void withdraw(double amount); + double getBalance(); + + friend std::ostream& operator<< (std::ostream &out, const BankAccount &ba); + + double getMeasure(); + + private: + double balance; +}; + +#endif diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/include/DataSetInterface.h b/Lectures/L27_SpecViaUML/DataSetInterface/include/DataSetInterface.h index 5e23bca5..ae93b230 100644 --- a/Lectures/L27_SpecViaUML/DataSetInterface/include/DataSetInterface.h +++ b/Lectures/L27_SpecViaUML/DataSetInterface/include/DataSetInterface.h @@ -7,14 +7,14 @@ class DataSetInterface { private: double sum; - Measurable* maximum; + Measurable *maximum; int count; public: DataSetInterface(); - void add(Measurable* x); + void add(Measurable *x); double getAverage(); - Measurable* getMaximum(); + Measurable *getMaximum(); }; #endif diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/src/BankAccount.cpp b/Lectures/L27_SpecViaUML/DataSetInterface/src/BankAccount.cpp new file mode 100644 index 00000000..2abe22d2 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetInterface/src/BankAccount.cpp @@ -0,0 +1,34 @@ +#include "BankAccount.h" + +BankAccount::BankAccount() +{ + this->balance = 0.0; +} + +void BankAccount::deposit(double amount) +{ + this->balance += amount; +} + +void BankAccount::withdraw(double amount) +{ + this->balance -= amount; +} + +double BankAccount::getBalance() +{ + return balance; +} + +double BankAccount::getMeasure() +{ + return balance; +} + +std::ostream& operator<< (std::ostream &out, const BankAccount &ba) +{ + //From http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/ + out << "BankAccount(" << ba.balance << ") "; + + return out; +} diff --git a/Lectures/L27_SpecViaUML/DataSetInterface/src/DataSetInterface.cpp b/Lectures/L27_SpecViaUML/DataSetInterface/src/DataSetInterface.cpp index d52db9d8..83204b04 100644 --- a/Lectures/L27_SpecViaUML/DataSetInterface/src/DataSetInterface.cpp +++ b/Lectures/L27_SpecViaUML/DataSetInterface/src/DataSetInterface.cpp @@ -7,7 +7,7 @@ DataSetInterface::DataSetInterface() : maximum() this->count = 0; } -void DataSetInterface::add(Measurable* x) +void DataSetInterface::add(Measurable *x) { this->sum += x->getMeasure(); if (count == 0 || maximum->getMeasure() < x->getMeasure()) maximum = x; @@ -20,7 +20,7 @@ double DataSetInterface::getAverage() else return sum/count; } -Measurable* DataSetInterface::getMaximum() +Measurable *DataSetInterface::getMaximum() { return maximum; } diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/Makefile b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/Makefile new file mode 100644 index 00000000..d2c5aca0 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/Makefile @@ -0,0 +1,53 @@ +SRC_DIRS := src +C_SRCS := $(foreach srcdir,$(SRC_DIRS),$(wildcard $(srcdir)/*.c)) +CXX_SRCS := $(foreach srcdir,$(SRC_DIRS),$(wildcard $(srcdir)/*.cpp)) +C_OBJS := ${C_SRCS:.c=.o} +CXX_OBJS := ${CXX_SRCS:.cpp=.o} +OBJS := $(C_OBJS) $(CXX_OBJS) +INCLUDE_DIRS := include +LIBRARY_DIRS := +LIBRARIES := + +prog_NAME := experiment +prog_DIR := bin +prog_FULL := $(prog_DIR)/$(prog_NAME) +prog_SRC_DIRS := experimentation +prog_C_SRCS := $(foreach srcdir,$(prog_SRC_DIRS),$(wildcard $(srcdir)/*.c)) +prog_CXX_SRCS := $(foreach srcdir,$(prog_SRC_DIRS),$(wildcard $(srcdir)/*.cpp)) +prog_C_OBJS := ${prog_C_SRCS:.c=.o} +prog_CXX_OBJS := ${prog_CXX_SRCS:.cpp=.o} +prog_OBJS := $(prog_C_OBJS) $(prog_CXX_OBJS) +prog_INCLUDE_DIRS := +prog_LIBRARY_DIRS := +prog_LIBRARIES := + +all_OBJS := $(OBJS) $(prog_OBJS) $(test_OBJS) +DEP := $(all_OBJS:%.o=%.d) + +CXXFLAGS += -std=c++11 +CXXFLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) +LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) +LDFLAGS += $(foreach library,$(LIBRARIES),-l$(library)) + +.PHONY: experiment src clean + +experiment: CXXFLAGS += $(foreach includedir,$(prog_INCLUDE_DIRS),-I$(includedir)) +experiment: LDFLAGS += $(foreach librarydir,$(prog_LIBRARY_DIRS),-L$(librarydir)) +experiment: LDFLAGS += $(foreach library,$(prog_LIBRARIES),-l$(library)) + +experiment: $(prog_FULL) + ./$(prog_FULL) + +$(prog_FULL): $(prog_OBJS) $(OBJS) + $(LINK.cc) $^ -o $@ + +-include $(DEP) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -MMD -c $< -o $@ + +clean: + @- $(RM) $(prog_FULL) + @- $(RM) $(prog_OBJS) + @- $(RM) $(OBJS) + @- $(RM) $(DEP) diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/.gitkeep b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/experiment b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/bin/experiment new file mode 100755 index 0000000000000000000000000000000000000000..6d4c70fa59ee5d0634c23861f7c618e64f8cd435 GIT binary patch literal 15452 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 literal 0 HcmV?d00001 diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/experimentation/main.cpp b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/experimentation/main.cpp new file mode 100644 index 00000000..de0e6cf8 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/experimentation/main.cpp @@ -0,0 +1,31 @@ +#include "PointMT.h" +#include "DataSetInterface.h" + +#include <iostream> +using namespace std; + +int main() +{ + + //Test Data Set Inteface with PointT + PointMT p1(0.0, 0.0); + PointMT p2(3.0, 4.0); + PointMT p3(7.0, 24.0); + PointMT p4(5.0, 12.0); + + DataSetInterface ds; + ds.add(&p1); + ds.add(&p2); + ds.add(&p3); + ds.add(&p4); + + cout << "average = " << ds.getAverage() << "\n"; + + Measurable *maxM = ds.getMaximum(); + + PointMT *maxP = (PointMT*) maxM; + + cout << "maximum = " << *maxP << "\n"; + + return 0; +} diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/DataSetInterface.h b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/DataSetInterface.h new file mode 100644 index 00000000..ae93b230 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/DataSetInterface.h @@ -0,0 +1,20 @@ +#ifndef DATASETINTERFACE_H +#define DATASETINTERFACE_H + +#include "Measurable.h" + +class DataSetInterface +{ + private: + double sum; + Measurable *maximum; + int count; + + public: + DataSetInterface(); + void add(Measurable *x); + double getAverage(); + Measurable *getMaximum(); +}; + +#endif diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/Measurable.h b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/Measurable.h new file mode 100644 index 00000000..16c20c1a --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/Measurable.h @@ -0,0 +1,10 @@ +#ifndef MEASURABLE_H +#define MEASURABLE_H + +class Measurable +{ + public: + virtual double getMeasure() = 0; +}; + +#endif diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointMT.h b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointMT.h new file mode 100644 index 00000000..c8c28f14 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointMT.h @@ -0,0 +1,14 @@ +#ifndef POINTMT_H +#define POINTMT_H + +#include "PointT.h" +#include "Measurable.h" + +class PointMT : public PointT, public Measurable +{ + public: + PointMT(double x, double y); + double getMeasure(); +}; + +#endif diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointT.h b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointT.h new file mode 100644 index 00000000..ce3f800e --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/include/PointT.h @@ -0,0 +1,21 @@ +#ifndef POINTT_H +#define POINTT_H + +#include <iostream> + +class PointT +{ + public: + PointT(double x, double y); + double xcoord(); + double ycoord(); + double distToOrigin(); + + friend std::ostream& operator<< (std::ostream &out, const PointT &point); + + private: + double xc; + double yc; +}; + +#endif diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/DataSetInterface.cpp b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/DataSetInterface.cpp new file mode 100644 index 00000000..83204b04 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/DataSetInterface.cpp @@ -0,0 +1,26 @@ +#include "DataSetInterface.h" +#include "Measurable.h" + +DataSetInterface::DataSetInterface() : maximum() +{ + this->sum = 0.0; + this->count = 0; +} + +void DataSetInterface::add(Measurable *x) +{ + this->sum += x->getMeasure(); + if (count == 0 || maximum->getMeasure() < x->getMeasure()) maximum = x; + count++; +} + +double DataSetInterface::getAverage() +{ + if (count == 0) return 0; + else return sum/count; +} + +Measurable *DataSetInterface::getMaximum() +{ + return maximum; +} diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointMT.cpp b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointMT.cpp new file mode 100644 index 00000000..efc60b99 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointMT.cpp @@ -0,0 +1,11 @@ +#include "PointMT.h" +#include "Measurable.h" + +PointMT::PointMT(double x, double y) : PointT(x, y) +{ +} + +double PointMT::getMeasure() +{ + return this->distToOrigin(); +} diff --git a/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointT.cpp b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointT.cpp new file mode 100644 index 00000000..3f1d5014 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetMultipleInheritance/src/PointT.cpp @@ -0,0 +1,38 @@ +#include "PointT.h" +#include <cmath> + +PointT::PointT(double x, double y) +{ + this->xc = x; + this->yc = y; +} + +double PointT::xcoord() +{ + return this->xc; +} + +double PointT::ycoord() +{ + return this->yc; +} + +double PointT::distToOrigin() +{ + double dx; + double dy; + + dx = this->xc; + dy = this->yc; + + return sqrt(pow(dx,2.0) + pow(dy,2.0)); +} + +std::ostream& operator<< (std::ostream &out, const PointT& point) +{ + //From http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/ + // Since operator<< is a friend of the Point class, we can access Point's members directly. + out << "PointT(" << point.xc << ", " << point.yc << ")"; + + return out; +} diff --git a/Lectures/L27_SpecViaUML/DataSetsAggregation.pdf b/Lectures/L27_SpecViaUML/DataSetsAggregation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed80247d83342071c054fdf831d2926ed83d3585 GIT binary patch literal 14507 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 T+CN5y6;RECMnfZ^07m;iH4&Yh literal 0 HcmV?d00001 diff --git a/Lectures/L27_SpecViaUML/DataSetsAggregation.xml b/Lectures/L27_SpecViaUML/DataSetsAggregation.xml new file mode 100644 index 00000000..f91e3926 --- /dev/null +++ b/Lectures/L27_SpecViaUML/DataSetsAggregation.xml @@ -0,0 +1 @@ +<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" version="8.4.6" editor="www.draw.io" type="device"><diagram id="51d45c3b-694b-ad9c-a1ca-de0ff4b50e78" name="Page-1">1VZdb8IgFP01fV3aslZ99HN7WbJEk7lHVq4tsS0GUdv9+lGhtohdzDJd5oPhHuDAOZdjdNA4K5443iQvjEDq+C4pHDRxfD8YhPK7AkoFoIGvgJhToiCvAeb0EzToanRHCWyNhYKxVNCNCUYszyESBoY5Zwdz2Yql5qkbHIMFzCOc2ugbJSJRaD9wG/wZaJzUJ3uunvnA0TrmbJfr8xwfrY4fNZ3hmkuv3yaYsEMLQlMHjTljQo2yYgxpZW1tm9o365g93ZtDLq7ZoNuyx+lOS59ggecgXhmVDOqOoqx9SUSWypHnoJHeCFxA0Xm4d5IkXwqwDAQv5ZLC7HZplofGca/GkpbbdRewbnJ8Im6EyoHWelk3snQfBS9urNh3/07yoyXZEgs5GVbpkRWhOGM5WSQ0l9LlxIxWzBNXVTqykhSNWhZJG3i5bBfv1Z6HoCoLKpY1gxw3M+oeQKxMntkq78p2PAKjhQLzGETrNdvmt90NtZMcUizo3jzxkr2aTueh4+n2z/qj7tlkaNZF0/ueR4mzeI6tPgm8qvtBV9BHOF8Po7tn/Z4vP7S0K9GR/J2+tW4r8fcU3vtvkW/nO7TzHVzt/u0j7/1W5i2iH4dels0/B7W8+XeGpl8=</diagram></mxfile> \ No newline at end of file diff --git a/Lectures/L27_SpecViaUML/MeasurableInterface.pdf b/Lectures/L27_SpecViaUML/MeasurableInterface.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c59665831ba138e22f2922cb4862e65f424fd183 GIT binary patch literal 15728 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 HBvAer5RO%E literal 0 HcmV?d00001 diff --git a/Lectures/L27_SpecViaUML/MeasurableInterface.xml b/Lectures/L27_SpecViaUML/MeasurableInterface.xml new file mode 100644 index 00000000..eb2f1155 --- /dev/null +++ b/Lectures/L27_SpecViaUML/MeasurableInterface.xml @@ -0,0 +1 @@ +<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" version="8.4.6" editor="www.draw.io" type="device"><diagram id="375c196d-1333-2840-e13d-7bbed8fb0d51" name="Page-1">3VbLbqMwFP0atiPAIWqWTdLHplKlVJp26eAbsAI4MiaP+fox2AaMSScaDYo0WUT28fXjnHuujYdW+fmF40P6xghkXuiTs4fWXhhGi7n8r4GLAtA8VEDCKVFQ0AEb+gs06Gu0ogRKK1Awlgl6sMGYFQXEwsIw5+xkh+1YZu96wAk4wCbGmYv+pESkCn2I/A5/BZqkZufA1yNbHO8TzqpC7+eFaNf81HCOzVo6vkwxYacehJ48tOKMCdXKzyvIammNbGre85XR9twcCnHLBJ2WI84qTX2NBd6A0McTFyNJKvJMtgIPLd1N9L5H4ALOPUhv+gIsB8EvMkSPzjT/1h+6f+rUDowZ0p7SJgNYJzhpV+5IyobmOc4ZOZy9cI7zg2SWiYZev0cLAXyHY2jhxAoyvSZ4y2WrQd4AlxXHWynftEreJGU4kZQzR8p3JgX7mJgzCmzOs4cRzv5EnCOH8xIX+8c4llU/ddkEizsSX4zUzYAtFOSxvn5lj1Ccs4J8pLSQ3OXAM61XXvuqp+986SC07GkEZyo+TZRsf9XtH1EzRx7304TVnW7sqrIlq3gMVtkLzBMQ1u0HxHoNXPX76pry4pBhQY/2gzEmr16uKYxe2aJB2S4GGVJH17P6N/hgoaElomGqFWFnoSbbLcebDBC45f6dA7YZi/cyOwSXKZA2c+NGCMIrRlDJN1boG6Hniy+rxAb5/KMzItcZ6G5GmA3zd6sR0PBumNAI7h34XxhhdlcjRIP8/e2N4LyO4b8ygux2n6YqvPv8R0+/AQ==</diagram></mxfile> \ No newline at end of file diff --git a/Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.pdf b/Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2056af399a59ee51edcb762a067c7ad744d232de GIT binary patch literal 17031 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 literal 0 HcmV?d00001 diff --git a/Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.xml b/Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.xml new file mode 100644 index 00000000..e73ededf --- /dev/null +++ b/Lectures/L27_SpecViaUML/MeasurableInterfaceInheritance.xml @@ -0,0 +1 @@ +<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" version="8.4.6" editor="www.draw.io" type="device"><diagram id="375c196d-1333-2840-e13d-7bbed8fb0d51" name="Page-1">3VfLbqMwFP0atiPAgTbLpmk7m0gjpdK0SwffgBXAkeO85uvHYPMwJg2KhkaaLCL7+NrmnHuuDQ56zk5vHG+TBSOQOr5LTg6aO74fTEP5XwBnBaDQV0DMKVGQ1wBL+gc06Gp0TwnsjEDBWCro1gQjlucQCQPDnLOjGbZmqbnrFsdgAcsIpzb6mxKRKPQxcBv8J9A4qXb2XD2ywtEm5myf6/0cH63LnxrOcLWWjt8lmLBjC0IvDnrmjAnVyk7PkBbSVrKpea8XRuvn5pCLIRN0Wg443WvqcyzwEoR+PHGuJElElsqW56CZvYne9wBcwKkF6U3fgGUg+FmG6NGJ5l/7Q/ePjdpeZYakpXSVAawTHNcrNyRlQ/Ps54wszo4f4mwrmaWipNfu0VwAX+MIajg2gqpeGbzislUiC8C7PccrKd+4Sg6S0h9Jyokl5S8mBVu8j0waeSbpyWMPaXck0oFFeobzzVMUybIfu2686R2JT3sKp8MWcvJUnL+yRyjOWE7eE5pL7nLglRYrz13V04e+tBCatTSCExUfVZRsfxbtH0E5Rz7uRxVWdJqxi8ru2J5HYNS9wDwGYRx/QIzrwFa/rW5VXxxSLOjBvDH65NXLlZXRqlvUqdtpJ0Pq0fWs9hHeWahriaCbakXYWqjMds1xkAE8u96/csAqZdFGZofgXQKkzly/ETz/ghFU8isrtI3Q8sWnUWKdfF51RmA7A93NCJNu/oYaAXXPhhGNYJ+B/4URJnc1QtDJ360ngnU7+uMZIbSMUC474AXAuvR6sjP4BSB4+MZ70Hu4yf0ti4eW/68a3vvC8O6/NLxK6bc4vvPqGk5uNLzvXlnoZsPLbvMxpsKbD1708hc=</diagram></mxfile> \ No newline at end of file diff --git a/Lectures/L27_SpecViaUML/src/DataSetInterface.java b/Lectures/L27_SpecViaUML/src/DataSetInterface.java index dcc87380..7f0a3895 100644 --- a/Lectures/L27_SpecViaUML/src/DataSetInterface.java +++ b/Lectures/L27_SpecViaUML/src/DataSetInterface.java @@ -1,7 +1,7 @@ public class DataSetInterface { private double sum; - private Measurable maximum; + private Measurable* maximum; private int count; public DataSetInterface() @@ -23,4 +23,4 @@ public class DataSetInterface public Measurable getMaximum() { return maximum; } -} \ No newline at end of file +} -- GitLab