0% found this document useful (0 votes)
41 views

Day Code Interfaces

The document discusses different implementations of queues in C# using interfaces. It defines an ICharQ interface for character queues and shows implementations of simple fixed-size, circular, and dynamic resizing queues that all implement this interface. It demonstrates putting characters into and getting them out of queues of each type through the common interface.

Uploaded by

brianweldt
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
41 views

Day Code Interfaces

The document discusses different implementations of queues in C# using interfaces. It defines an ICharQ interface for character queues and shows implementations of simple fixed-size, circular, and dynamic resizing queues that all implement this interface. It demonstrates putting characters into and getting them out of queues of each type through the common interface.

Uploaded by

brianweldt
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 14

C# Programming Purvis Samsoodeen

listing 1
public interface ISeries {
int GetNext(); // return next number in series
void Reset(); // restart
void SetStart(int x); // set starting value
}

listing 2
// Implement ISeries.
class ByTwos : ISeries {
int start;
int val;

public ByTwos() {
start = 0;
val = 0;
}

public int GetNext() {


val += 2;
return val;
}

public void Reset() {


start = 0;
val = 0;
}

public void SetStart(int x) {


start = x;
val = x;
}
}

listing 3
// Demonstrate the ByTwos interface.
using System;

class ISeriesDemo {
static void Main() {
ByTwos ob = new ByTwos();

for(int i=0; i < 5; i++)


Console.WriteLine("Next value is " +
ob.GetNext());

Console.WriteLine("\nResetting");
ob.Reset();
for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " +
ob.GetNext());

Console.WriteLine("\nStarting at 100");
ob.SetStart(100);
for(int i=0; i < 5; i++)

Page 1 of 14
C# Programming Purvis Samsoodeen

Console.WriteLine("Next value is " +


ob.GetNext());
}
}

listing 4
// Implement ISeries and add GetPrevious().
class ByTwos : ISeries {
int start;
int val;
int prev;

public ByTwos() {
start = 0;
val = 0;
prev = -2;
}

public int GetNext() {


prev = val;
val += 2;
return val;
}

public void Reset() {


start = 0;
val = 0;
prev = -2;
}

public void SetStart(int x) {


start = x;
val = x;
prev = x - 2;
}

// A method not specified by ISeries.


int GetPrevious() {
return prev;
}
}

listing 5
// Implement ISeries.
class ByThrees : ISeries {
int start;
int val;

public ByThrees() {
start = 0;
val = 0;
}

public int GetNext() {


val += 3;

Page 2 of 14
C# Programming Purvis Samsoodeen

return val;
}

public void Reset() {


start = 0;
val = 0;
}

public void SetStart(int x) {


start = x;
val = x;
}
}

listing 6
// Demonstrate interface references.
using System;

// Define the interface


public interface ISeries {
int GetNext(); // return next number in series
void Reset(); // restart
void SetStart(int x); // set starting value
}

// Implement ISeries one way.


class ByTwos : ISeries {
int start;
int val;

public ByTwos() {
start = 0;
val = 0;
}

public int GetNext() {


val += 2;
return val;
}

public void Reset() {


start = 0;
val = 0;
}

public void SetStart(int x) {


start = x;
val = x;
}
}

// Implement ISeries another way.


class ByThrees : ISeries {
int start;
int val;

Page 3 of 14
C# Programming Purvis Samsoodeen

public ByThrees() {
start = 0;
val = 0;
}

public int GetNext() {


val += 3;
return val;
}

public void Reset() {


start = 0;
val = 0;
}

public void SetStart(int x) {


start = x;
val = x;
}
}

class ISeriesDemo2 {
static void Main() {
ByTwos twoOb = new ByTwos();
ByThrees threeOb = new ByThrees();
ISeries ob;

for(int i=0; i < 5; i++) {


ob = twoOb;
Console.WriteLine("Next ByTwos value is " +
ob.GetNext());
ob = threeOb;
Console.WriteLine("Next ByThrees value is " +
ob.GetNext());
}
}
}

listing 7
// A character queue interface.
public interface ICharQ {
// Put a character into the queue.
void Put(char ch);

// Get a character from the queue.


char Get();
}

listing 8
// Demonstrate the ICharQ interface.

using System;

// A simple, fixed-size queue class for characters.

Page 4 of 14
C# Programming Purvis Samsoodeen

class SimpleQueue : ICharQ {


char[] q; // this array holds the queue
int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.


public SimpleQueue(int size) {
q = new char[size+1]; // allocate memory for queue
putloc = getloc = 0;
}

// Put a character into the queue.


public void Put(char ch) {
if(putloc==q.Length-1) {
Console.WriteLine(" -- Queue is full.");
return;
}

putloc++;
q[putloc] = ch;
}

// Get a character from the queue.


public char Get() {
if(getloc == putloc) {
Console.WriteLine(" -- Queue is empty.");
return (char) 0;
}

getloc++;
return q[getloc];
}
}

listing 9
// A circular queue.
class CircularQueue : ICharQ {
char[] q; // this array holds the queue
int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.


public CircularQueue(int size) {
q = new char[size+1]; // allocate memory for queue
putloc = getloc = 0;
}

// Put a character into the queue.


public void Put(char ch) {
/* Queue is full if either putloc is one less than
getloc, or if putloc is at the end of the array
and getloc is at the beginning. */
if(putloc+1==getloc ||
((putloc==q.Length-1) && (getloc==0))) {
Console.WriteLine(" -- Queue is full.");
return;
}

Page 5 of 14
C# Programming Purvis Samsoodeen

putloc++;
if(putloc==q.Length) putloc = 0; // loop back
q[putloc] = ch;
}

// Get a character from the queue.


public char Get() {
if(getloc == putloc) {
Console.WriteLine(" -- Queue is empty.");
return (char) 0;
}

getloc++;
if(getloc==q.Length) getloc = 0; // loop back
return q[getloc];
}
}

listing 10
// A dynamic circular queue.
// This implementation automatically doubles the
// size of the queue when it is full.
class DynQueue : ICharQ {
char[] q; // this array holds the queue
int putloc, getloc; // the put and get indices

// Construct an empty queue given its size.


public DynQueue(int size) {
q = new char[size+1]; // allocate memory for queue
putloc = getloc = 0;
}

// Put a character into the queue.


public void Put(char ch) {
/* If the queue is full, double the size of the
underlying array. */
if(putloc+1==getloc ||
((putloc==q.Length-1) && (getloc==0))) {

// Allocate a larger array for the queue.


char[] t = new char[q.Length * 2];

// Copy elements into the new array.


int i;
for(i=1; putloc != getloc; i++)
t[i] = Get();

// Reset the getloc and putloc indexes.


getloc = 0;
putloc = i-1;

// Make q refer to the new queue.


q = t;
}

Page 6 of 14
C# Programming Purvis Samsoodeen

putloc++;
if(putloc==q.Length) putloc = 0; // loop back
q[putloc] = ch;
}

// Get a character from the queue.


public char Get() {
if(getloc == putloc) {
Console.WriteLine(" -- Queue is empty.");
return (char) 0;
}

getloc++;
if(getloc==q.Length) getloc = 0; // loop back
return q[getloc];
}
}

listing 11
// Demonstrate the queues.
class IQDemo {
static void Main() {
SimpleQueue q1 = new SimpleQueue(10);
DynQueue q2 = new DynQueue(5);
CircularQueue q3 = new CircularQueue(10);

ICharQ iQ;

char ch;
int i;

// Assign iQ a reference to a simple, fixed-size queue.


iQ = q1;

// Put some characters into queue.


for(i=0; i < 10; i++)
iQ.Put((char) ('A' + i));

// Show the queue.


Console.Write("Contents of fixed-size queue: ");
for(i=0; i < 10; i++) {
ch = iQ.Get();
Console.Write(ch);
}
Console.WriteLine();

// Assign iQ a reference to a dynamic queue.


iQ = q2;

// Put some characters into dynamic queue.


for(i=0; i < 10; i++)
iQ.Put((char) ('Z' - i));

Page 7 of 14
C# Programming Purvis Samsoodeen

// Show the queue.


Console.Write("Contents of dynamic queue: ");
for(i=0; i < 10; i++) {
ch = iQ.Get();
Console.Write(ch);
}

Console.WriteLine();

// Assign iQ a reference to a circular queue.


iQ = q3;

// Put some characters into circular queue.


for(i=0; i < 10; i++)
iQ.Put((char) ('A' + i));

// Show the queue.


Console.Write("Contents of circular queue: ");
for(i=0; i < 10; i++) {
ch = iQ.Get();
Console.Write(ch);
}

Console.WriteLine();

// Put more characters into circular queue.


for(i=10; i < 20; i++)
iQ.Put((char) ('A' + i));

// Show the queue.


Console.Write("Contents of circular queue: ");
for(i=0; i < 10; i++) {
ch = iQ.Get();
Console.Write(ch);
}

Console.WriteLine("\nStore and consume from" +


" circular queue.");

// Use and consume from circular queue.


for(i=0; i < 20; i++) {
iQ.Put((char) ('A' + i));
ch = iQ.Get();
Console.Write(ch);
}

}
}

listing 12
// Use a property in an interface.
using System;

public interface ISeries {


// An interface property.

Page 8 of 14
C# Programming Purvis Samsoodeen

int Next {
get; // return the next number in series
set; // set next number
}
}

// Implement ISeries.
class ByTwos : ISeries {
int val;

public ByTwos() {
val = 0;
}

// Get or set value.


public int Next {
get {
val += 2;
return val;
}
set {
val = value;
}
}
}

// Demonstrate an interface property.


class ISeriesDemo3 {
static void Main() {
ByTwos ob = new ByTwos();

// Access series through a property.


for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " + ob.Next);

Console.WriteLine("\nStarting at 21");
ob.Next = 21;
for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " + ob.Next);
}
}

listing 13
// Add an indexer in an interface.
using System;

public interface ISeries {


// An interface property.
int Next {
get; // return the next number in series
set; // set next number
}

// An interface indexer.
int this[int index] {

Page 9 of 14
C# Programming Purvis Samsoodeen

get; // return the specified number in series


}
}

// Implement ISeries.
class ByTwos : ISeries {
int val;

public ByTwos() {
val = 0;
}

// Get or set a value using a property.


public int Next {
get {
val += 2;
return val;
}
set {
val = value;
}
}

// Get a value using an indexer.


public int this[int index] {
get {
val = 0;
for(int i=0; i<index; i++)
val += 2;
return val;
}
}
}

// Demonstrate an interface indexer.


class ISeriesDemo4 {
static void Main() {
ByTwos ob = new ByTwos();

// Access series through a property.


for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " + ob.Next);

Console.WriteLine("\nStarting at 21");
ob.Next = 21;
for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " +
ob.Next);

Console.WriteLine("\nResetting to 0");
ob.Next = 0;

// Access series through an indexer.


for(int i=0; i < 5; i++)
Console.WriteLine("Next value is " + ob[i]);

Page 10 of 14
C# Programming Purvis Samsoodeen

}
}

listing 14
// One interface can inherit another.
using System;

public interface IA {
void Meth1();
void Meth2();
}

// IB now includes Meth1() and Meth2() -- it adds Meth3().


public interface IB : IA {
void Meth3();
}

// This class must implement all of IA and IB.


class MyClass : IB {
public void Meth1() {
Console.WriteLine("Implement Meth1().");
}

public void Meth2() {


Console.WriteLine("Implement Meth2().");
}

public void Meth3() {


Console.WriteLine("Implement Meth3().");
}
}

class IFExtend {
static void Main() {
MyClass ob = new MyClass();

ob.Meth1();
ob.Meth2();
ob.Meth3();
}
}

listing 15
interface IMyIF {
int MyMeth(int x);
}

listing 16
class MyClass : IMyIF {
int IMyIF.MyMeth(int x) {
return x / 3;
}
}

listing 17

Page 11 of 14
C# Programming Purvis Samsoodeen

// Explicitly implement an interface member.


using System;

interface IEven {
bool IsOdd(int x);
bool IsEven(int x);
}

class MyClass : IEven {


// Explicit implementation.
bool IEven.IsOdd(int x) {
if((x%2) != 0) return true;
else return false;
}

// Normal implementation.
public bool IsEven(int x) {
IEven o = this; // reference to invoking object

return !o.IsOdd(x);
}
}

class Demo {
static void Main() {
MyClass ob = new MyClass();
bool result;

result = ob.IsEven(4);
if(result) Console.WriteLine("4 is even.");
else Console.WriteLine("3 is odd.");

// result = ob.IsOdd(); // Error, not exposed.


}
}

listing 18
// Use explicit implementation to remove ambiguity.
using System;

interface IMyIF_A {
int Meth(int x);
}

interface IMyIF_B {
int Meth(int x);
}

// MyClass implements both interfaces.


class MyClass : IMyIF_A, IMyIF_B {
IMyIF_A a_ob;
IMyIF_B b_ob;

// Explicitly implement the two Meth()s.


int IMyIF_A.Meth(int x) {

Page 12 of 14
C# Programming Purvis Samsoodeen

return x + x;
}
int IMyIF_B.Meth(int x) {
return x * x;
}

// Call Meth() through an interface reference.


public int MethA(int x){
a_ob = this;
return a_ob.Meth(x); // calls IMyIF_A
}

public int MethB(int x){


b_ob = this;
return b_ob.Meth(x); // calls IMyIF_B
}
}

class FQIFNames {
static void Main() {
MyClass ob = new MyClass();

Console.Write("Calling IMyIF_A.Meth(): ");


Console.WriteLine(ob.MethA(3));

Console.Write("Calling IMyIF_B.Meth(): ");


Console.WriteLine(ob.MethB(3));
}
}

listing 19
// Demonstrate a structure.
using System;

// Define a structure.
struct Account {
public string name;
public double balance;

public Account(string n, double b) {


name = n;
balance = b;
}
}

// Demonstrate Account structure.


class StructDemo {
static void Main() {
Account acc1 = new Account("Tom", 1232.22); // explicit constructor
Account acc2 = new Account(); // default constructor
Account acc3; // no constructor

Console.WriteLine(acc1.name + " has a balance of " + acc1.balance);


Console.WriteLine();

Page 13 of 14
C# Programming Purvis Samsoodeen

if(acc2.name == null) Console.WriteLine("acc2.name is null.");


Console.WriteLine("acc2.balance is " + acc2.balance);
Console.WriteLine();

// Must initialize acc3 prior to use.


acc3.name = "Mary";
acc3.balance = 99.33;
Console.WriteLine(acc3.name + " has a balance of " + acc3.balance);
}
}

listing 20
// Demonstrate an enumeration.
using System;

class EnumDemo {
enum Coin { Penny, Nickel, Dime, Quarter, HalfDollar, Dollar };

static void Main() {


Coin c; // declare an enum variable

// Use c to cycle through the enum by use of a for loop.


for(c = Coin.Penny; c <= Coin.Dollar; c++) {
Console.WriteLine(c + " has value of " + (int) c);

// Use an enumeration value to control a switch.


switch(c) {
case Coin.Nickel:
Console.WriteLine("A nickel is 5 pennies.");
break;
case Coin.Dime:
Console.WriteLine("A dime is 2 nickels.");
break;
case Coin.Quarter:
Console.WriteLine("A quarter is 5 nickels.");
break;
case Coin.HalfDollar:
Console.WriteLine("A half-dollar is 5 dimes.");
break;
case Coin.Dollar:
Console.WriteLine("A dollar is 10 dimes.");
break;
}
Console.WriteLine();
}
}
}

Page 14 of 14

You might also like