Klasy abstrakcyjne i ich formy

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.

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);
        }
    }
}


3

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

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ć.

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());

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.

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

0

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

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 :)

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?

1

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

2

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

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);
        }
    }
}



1 użytkowników online, w tym zalogowanych: 0, gości: 1