Använd vänsterpil och högerpil för att navigera

Eller Ctrl+P för att skriva ut till PDF (eller på papper)

Föreläsning 11

Gränssnitt (interfaces)

Gränssnitt (interfaces)

Kontrakt för klasser

Hitta äldsta personen i en array

  1. class Person {
  2. public string Name;
  3. public int Age;
  4. public double Height;
  5. }
  6. public static int FindMaxPerson(Person[] values) {
  7. Person max = values[0];
  8. foreach (Person x in values) {
  9. if (x.Age > max.Age) {
  10. max = x;
  11. }
  12. }
  13. return max.Age;
  14. }

Anrop med personer

  1. Person[] people = new Person[] {
  2. new Person {
  3. Name = "Cate",
  4. Age = 48,
  5. Height = 172
  6. },
  7. new Person {
  8. Name = "Brad",
  9. Age = 53,
  10. Height = 183
  11. },
  12. new Person {
  13. Name = "Zac",
  14. Age = 30,
  15. Height = 179
  16. }
  17. };
  18. int highestAge = FindMaxPerson(people);

Hitta längsta kursen i en array

  1. class Course {
  2. public string Name;
  3. public string Teacher;
  4. public int Points;
  5. }
  6. public static int FindMaxCourse(Course[] values) {
  7. Course max = values[0];
  8. foreach (Course x in values) {
  9. if (x.Points > max.Points) {
  10. max = x;
  11. }
  12. }
  13. return max.Points;
  14. }

Anrop med kurser

  1. Course[] courses = new Course[] {
  2. new Course {
  3. Name = "Programmeringsteknik",
  4. Teacher = "Jakob",
  5. Points = 65
  6. },
  7. new Course {
  8. Name = "Databashantering",
  9. Teacher = "Jakob",
  10. Points = 15
  11. },
  12. new Course {
  13. Name = "Matematik",
  14. Teacher = "Robin",
  15. Points = 40
  16. }
  17. };
  18. int highestPoints = FindMaxCourse(courses);

Vad har koden gemensamt?

  1. public static int FindMaxCourse(Course[] values) {
  2. Course max = values[0];
  3. foreach (Course x in values) {
  4. if (x.Points > max.Points) {
  5. max = x;
  6. }
  7. }
  8. return max.Points;
  9. }
  10. public static int FindMaxPerson(Person[] values) {
  11. Person max = values[0];
  12. foreach (Person x in values) {
  13. if (x.Age > max.Age) {
  14. max = x;
  15. }
  16. }
  17. return max.Age;
  18. }

Gemensamma delar

  1. public static int FindMax______(______[] values) {
  2. ______ max = values[0];
  3. foreach (______ x in values) {
  4. if (x.______ > max.______) {
  5. max = x;
  6. }
  7. }
  8. return max.______;
  9. }
  10. public static int FindMax______(______[] values) {
  11. ______ max = values[0];
  12. foreach (______ x in values) {
  13. if (x.___ > max.___) {
  14. max = x;
  15. }
  16. }
  17. return max.___;
  18. }

Generell version med påhittad datatyp

  1. public static int FindMax(HasOrder[] values) {
  2. HasOrder max = values[0];
  3. foreach (HasOrder x in values) {
  4. if (x.Order > max.Order) {
  5. max = x;
  6. }
  7. }
  8. return max.Order;
  9. }

Hur anropar vi metoden?

  1. Person[] people = new Person[] {
  2. new Person {
  3. Name = "Cate",
  4. Age = 48,
  5. Height = 172
  6. },
  7. new Person {
  8. Name = "Brad",
  9. Age = 53,
  10. Height = 183
  11. },
  12. new Person {
  13. Name = "Zac",
  14. Age = 30,
  15. Height = 179
  16. }
  17. };
  18. int highestAge = FindMax(people);

Definiera ett interface

  1. interface HasOrder {
  2. int Order { get; }
  3. }
  4. class Person : HasOrder {
  5. public string Name;
  6. public int Age;
  7. public double Height;
  8. }

Implementera (uppfylla) ett interface

  1. interface HasOrder {
  2. int Order { get; }
  3. }
  4. class Person : HasOrder {
  5. public string Name;
  6. public int Age;
  7. public double Height;
  8. public int Order {
  9. get {
  10. return Age;
  11. }
  12. }
  13. }

Namnkonvention för gränssnitt i C#

  1. interface IOrder {
  2. int Order { get; }
  3. }
  4. class Person : IOrder {
  5. public string Name;
  6. public int Age;
  7. public double Height;
  8. public int Order {
  9. get {
  10. return Age;
  11. }
  12. }
  13. }

Nu är koden giltig

  1. Person[] people = new Person[] {
  2. new Person {
  3. Name = "Cate",
  4. Age = 48,
  5. Height = 172
  6. },
  7. new Person {
  8. Name = "Brad",
  9. Age = 53,
  10. Height = 183
  11. },
  12. new Person {
  13. Name = "Zac",
  14. Age = 30,
  15. Height = 179
  16. }
  17. };
  18. int highestAge = FindMax(people);

Samma metod med kurser

  1. Course[] courses = new Course[] {
  2. new Course {
  3. Name = "Programmeringsteknik",
  4. Teacher = "Jakob",
  5. Points = 65
  6. },
  7. new Course {
  8. Name = "Databashantering",
  9. Teacher = "Jakob",
  10. Points = 15
  11. },
  12. new Course {
  13. Name = "Matematik",
  14. Teacher = "Robin",
  15. Points = 40
  16. }
  17. };
  18. int highestPoints = FindMax(courses);

Hur implementerar vi gränssnittet för Course?

  1. interface IOrder {
  2. int Order { get; }
  3. }
  4. class Course : IOrder {
  5. public string Name;
  6. public string Teacher;
  7. public int Points;
  8. ...
  9. ...
  10. ...
  11. ...
  12. ...
  13. }

Implementation av gränssnittet för
Course

  1. interface IOrder {
  2. int Order { get; }
  3. }
  4. class Course : IOrder {
  5. public string Name;
  6. public string Teacher;
  7. public int Points;
  8. public int Order {
  9. get {
  10. return Points;
  11. }
  12. }
  13. }

Hur implementerar vi gränssnittet för familjer?

  1. interface IOrder {
  2. int Order { get; }
  3. }
  4. class Family : IOrder {
  5. public string LastName { get; set; }
  6. public string City { get; set; }
  7. public string[] Members { get; set; }
  8. ...
  9. ...
  10. ...
  11. ...
  12. ...
  13. }

Implementation av gränssnittet för
familjer

  1. interface IOrder {
  2. int Order { get; }
  3. }
  4. class Family : IOrder {
  5. public string LastName { get; set; }
  6. public string City { get; set; }
  7. public string[] Members { get; set; }
  8. public int Order {
  9. get {
  10. return Members.Length;
  11. }
  12. }
  13. }

Anrop med familjer

  1. Family[] families = new Family[] {
  2. new Family {
  3. LastName = "Svensson",
  4. City = "Stockholm",
  5. Members = new string[] {"Anders", "Eva"}
  6. },
  7. new Family {
  8. LastName = "Smith",
  9. City = "Chicago",
  10. Members = new string[] {"John"}
  11. },
  12. new Family {
  13. LastName = "Kowalski",
  14. City = "Warsaw",
  15. Members = new string[] {"Maciej", "Ania", "Agata"}
  16. }
  17. };
  18. int mostMembers = FindMax(families);

Gränssnitt för textsökning

  1. interface IContains {
  2. bool Contains(string search);
  3. }
  4. class Person : IContains {
  5. public string Name;
  6. public int Age;
  7. public double Height;
  8. public bool Contains(string search) {
  9. return Name == search;
  10. }
  11. }
  12. class Course : IContains {
  13. public string Name;
  14. public string Teacher;
  15. public int Points;
  16. public bool Contains(string search) {
  17. return Name == search || Teacher == search;
  18. }
  19. }

Anrop med personer och kurser

  1. Person p = new Person {
  2. Name = "Jakob",
  3. Age = 30,
  4. Height = 181
  5. };
  6. bool match1 = p.Contains("Jakob");
  7. Course c = new Course {
  8. Name = "Programmeringsteknik",
  9. Teacher = "Jakob",
  10. Points = 65
  11. };
  12. bool match2 = c.Contains("Jakob");

Array med olika klasser men samma gränssnitt

  1. IContains[] database = new IContains[] {
  2. new Person { Name = "Jakob", ... },
  3. new Course { Name = "Programmeringsteknik", ... },
  4. ...
  5. };
  6. int matches = 0;
  7. foreach (IContains entry in database) {
  8. if (entry.Contains("Jakob")) {
  9. matches += 1;
  10. }
  11. }
  12. Console.WriteLine("Found " + matches + " matches");

Samma klass kan implementera flera gränssnitt

  1. interface IContains {
  2. bool Contains(string search);
  3. }
  4. interface IOrder {
  5. int Order { get; }
  6. }
  7. class Course : IContains, IOrder {
  8. public string Name;
  9. public string Teacher;
  10. public int Points;
  11. public bool Contains(string search) {
  12. return Name == search || Teacher == search;
  13. }
  14. public int Order {
  15. get {
  16. return Points;
  17. }
  18. }
  19. }

Anrop av båda metoderna med samma klass

  1. Course[] courses = new Course[] {
  2. new Course {
  3. Name = "Programmeringsteknik",
  4. Teacher = "Jakob",
  5. Points = 65
  6. },
  7. new Course {
  8. Name = "Databashantering",
  9. Teacher = "Jakob",
  10. Points = 15
  11. },
  12. new Course {
  13. Name = "Matematik",
  14. Teacher = "Robin",
  15. Points = 40
  16. }
  17. };
  18. int highestPoints = FindMax(courses);
  19. if (courses[0].Contains("Jakob")) {
  20. ...
  21. }

Sammanfattning