Klasy abstrakcyjne i ich formy

Klasy abstrakcyjne i ich formy
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Hej,
mam problem ze zrozumieniem treści zadania i szukam podpowiedzi, a nie osoby, która rozwiąże za mnie zadanie.
Poniżej treść i kod.

Zmień kod tak aby poprawnie wstrzykiwana byla zaleznosc ktora nie bedzie na sztywno powiazana ze StringRepository tylko bedzie korzystala z odpowiedniej formy abstrakcji.

Kopiuj
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp4
{
    class DIExcercise
    {
        static void Main(string[] args)
        {
            var processor = new StringProcessor(new StringRepository());

            processor.GenerateData();
            processor.DisplayAllStrings();
        }
    }

    class StringProcessor
    {
        private readonly StringRepository stringRepository;

        public StringProcessor(StringRepository stringRepository)
        {
            this.stringRepository = stringRepository;
        }

        public void GenerateData()
        {
            stringRepository.AddString("Foo");
            stringRepository.AddString("Bar");
            stringRepository.AddString("Nada");

            stringRepository.RemoveString("Foo");
        }

        public void DisplayAllStrings()
        {
            foreach(var s in stringRepository.GetStrings())
            {
                Console.WriteLine(s);
            }
        }
    }

    class StringRepository
    {
        private List<string> strings = new List<string>();
        public void AddString(string s)
        {
            strings.Add(s);
        }

        public string[] GetStrings()
        {
            return strings.ToArray();
        } 

        public void RemoveString(string s)
        {
            strings.Remove(s);
        }
    }
}


KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
3

A wiesz co to jlasa abstrakcyjna (czy interfejs) i dziedziczenie (lub implementacja interfejsu)?

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
2

Z tego co ja rozumieć treść zadania to mylisz pojęcie klasy abstrakcyjnej z wprowadzeniem abstrakcji jako takiej, a ona nie musi być wcale realizowana przez klasy abstrakcyjne. W tym momencie wymuszasz przekazanie instancji StringRepository to StringProcessor, a mógłbyś oprzeć się tylko o interfejs udostępniany przez StringRepository.

Popatrz na przykłady związane z dependency inversion principle i powinno Ci się rozjaśnić.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1

Mój plan wyglądał by tak:

  • Utworzyć klasę abstrakcyjną któa ma wszystkie te same metody co StringRepository (lepszy byłby interfejs, ale jak w zadaniu jest klasa abstrakcyjna to nie ma się co kłócić) tylko że puste/ abstrakcyjne czyli bez implementacji
  • Dodać dziedziczenie tak żeby StringRepository dziedziczył z nowej klasy abstrakcyjnej
  • Wszędzie gdzie masz wystąpienie StringRepository wewnątrz StringProcessor zastąpić na utworzoną klasę abstrakcyjną (czy interfejs)

Użycie StringRepository powinno pozostać tylko w linii var processor = new StringProcessor(new StringRepository());

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
3
KamilAdam napisał(a):
  • Utworzyć klasę abstrakcyjną któa ma wszystkie te same metody co StringRepository (lepszy byłby interfejs, ale jak w zadaniu jest klasa abstrakcyjna to nie

Ale w zadaniu nie ma informacji o klasie abstrakcyjnej, tylko o formie abstrakcji. Zarówno klasa abstrakcyjna jak i interfejs są formami abstrakcji.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1
Saalin napisał(a):

Ale w zadaniu nie ma informacji o klasie abstrakcyjnej, tylko o formie abstrakcji. Zarówno klasa abstrakcyjna jak i interfejs są formami abstrakcji.

Racja, w takim wypadku wybieram interfejs

M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

Po kilku dniach zrobiłem myślę, że to co trzeba

Kopiuj
using System.Collections.Generic;


namespace DIExcercise
{

    interface IStringNew
    {
         void Addstring();

        string[] GetStrings();

        void RemoveString();
    }
    class DIExcercise
    {
        static void Main(string[] args)
        {
            var processor = new StringProcessor(new StringRepository());

            processor.GenerateData();
            processor.DisplayAllStrings();
        }
    }

    class StringProcessor: IStringNew
    {
        private readonly StringRepository IStringNew;

        public StringProcessor(StringRepository stringRepository)
        {
            this.IStringNew = stringRepository;
        }

        public void GenerateData()
        {
            IStringNew.AddString("Foo");
            IStringNew.AddString("Bar");
            IStringNew.AddString("Nada");

            IStringNew.RemoveString("Nada");
        }

        public void DisplayAllStrings()
        {
            foreach (var s in IStringNew.GetStrings())
            {
                Console.WriteLine(s);
            }
        }

        void IStringNew.Addstring()
        {
            throw new NotImplementedException();
        }

        string[] IStringNew.GetStrings()
        {
            throw new NotImplementedException();
        }

        void IStringNew.RemoveString()
        {
            throw new NotImplementedException();
        }
    }

    class StringRepository
    {
        private List<string> strings = new List<string>();
        public void AddString(string s)
        {
            strings.Add(s);
        }

        public string[] GetStrings()
        {
            return strings.ToArray();
        }

        public void RemoveString(string s)
        {
            strings.Remove(s);
        }
    }
}


@KamilAdam: Będę wdzięczny za feedback :)

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
3
marjar9414 napisał(a):

@KamilAdam: Będę wdzięczny za feedback :)

Ja dam Ci feedback, choć nie prosiłeś. Jest kompletnie źle. StringProcessor nadal zależny jest wprost od StringRepository, a wprowadzony interfejs jest kompletnie bezużyteczny. Celem zadania było wprowadzenie abstrakcji nad StringRepository, jest to wprost w treści zadania. Teraz masz dodatkowy interfejs, jakieś IStringNew do niczego nie używane, bo i jak, skoro wszystko rzuca NotImplementedException?
Co chciałeś osiągnąć przez ten kod?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1

C# nie znam, ale na moje oko to jest to źle. To klasa StringRepository miała implementować interfejs

M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
2

Dziękuje panowie, udało się :)

Kopiuj
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp4
{
    interface IStringRepository
    {
        public void AddString(string s);

        public string[] GetStrings();

        public void RemoveString(string s);
    }
    class DIExcercise
    {
        static void Main(string[] args)
        {
            var processor = new StringProcessor(new StringRepository());

            processor.GenerateData();
            processor.DisplayAllStrings();
        }
    }

    class StringProcessor
    {
        private readonly IStringRepository stringRepository;

        public StringProcessor(IStringRepository stringRepository)
        {
            this.stringRepository = stringRepository;
        }

        public void GenerateData()
        {
            stringRepository.AddString("Foo");
            stringRepository.AddString("Bar");
            stringRepository.AddString("Nada");

            stringRepository.RemoveString("Foo");
        }

        public void DisplayAllStrings()
        {
            foreach (var s in stringRepository.GetStrings())
            {
                Console.WriteLine(s);
            }
        }
    }

    class StringRepository: IStringRepository
    {
        private List<string> strings = new List<string>();
        public void AddString(string s)
        {
            strings.Add(s);
        }

        public string[] GetStrings()
        {
            return strings.ToArray();
        }

        public void RemoveString(string s)
        {
            strings.Remove(s);
        }
    }
}



Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.