Co zamiast funkcji zaprzyjaźnionych jest w c# ?

Co zamiast funkcji zaprzyjaźnionych jest w c# ?
T2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

Co zamiast funkcji zaprzyjaźnionych jest w c# ?
Bo jeśli chcę przeładować operator << dla jakiejś klasy w C++ to trzeba w klasie zamieścić deklarację przyjaźni z tą funkcją przeładowującą. A jak jest w c#?

mar-ek1
  • Rejestracja:prawie 14 lat
  • Ostatnio:3 dni
  • Postów:525
0

O przeładowaniu operatorów jest wspomniane np. w dokumentacji na MSDN ;) https://msdn.microsoft.com/pl-pl/library/8edha89s.aspx
Po prostu dodajesz specyficzną funkcję statyczną w klasie.


Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:10 dni
  • Postów:2512
0

Przeładowanie operatorów ma swoje ograniczenia. Inaczej niż w C++ zrobisz tak obiekt > 1, ale już nie zrobisz tak: 1 > obiekt, ponieważ funkcja przeładowująca jest elementem składowym klasy. Przed przeładowywaniem operatorów trzeba się dobrze zastanowić czy aby na pewno jest to tobie potrzebne. Ja w praktyce zawodowej jeszcze przeładowania nie potrzebowałem.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

może przedstaw konkretny problem, a nie porównuj wszystkiego do C++...

T2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

Mam klase zespolona. Definiuje funkcje globalna dodającą liczby zespoloną. W klasie zespolona część rzeczywista i urojona to dane prywatne. Aby funkcja globalna dodająca liczby zespole miała do nich dostęp muszę w klasie zespolona zadeklarować przyjaźń z tą funkcją. Jak by to wyglądało w c#?

FA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:475
0

W c# wyglada to tak, ze uzywasz klasy struktury Complex

edytowany 1x, ostatnio: FakeAccount
T2
  • Rejestracja:prawie 11 lat
  • Ostatnio:9 miesięcy
  • Postów:194
0

W c# zrobił bym tak :
Utworzył strukturę/klasę : Liczba zespolona
Klasa zawierała by dwa publiczne property : Część rzeczywistą oraz urojoną
Przeciążył bym operatory : + - * / etc (Operatory bez problemu miały by dostęp do elementów składowych poprzez publiczne property.)

edytowany 1x, ostatnio: teo215
T2
w c++ tak samo bym mógł zrobić bez użycia przyjaźni. Jednak ja chce się dowiedzieć co zrobić w c# jak dane są prywatne.
Sarrus
Do danych prywatnych ma tylko dostęp dana klasa. Koniec i kropka.
T2
Jeżeli dane są prywatne to widocznie ktoś chciał aby one były prywatne i nie należy ich używać z zewnątrz. Po części możesz jeszcze używać słowa kluczowego internal ale to nie będzie już to samo.
0

operator dodawania może być wewnątrz klasy zespolona i ma dostęp do prywatnych składowych tej klasy, nie widzę problemu

grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

Funkcje zaprzyjaźnione to twór, który łamie zasady enkapsulacji w programowaniu obiektowym. Nie po to ktoś robił składowe klasy jako prywatne, że był do nich dostęp. W C# nie tędy droga, bo C# to nie C++.

A przeładowywać operatory można za pomocą funkcji statycznych wewnątrz klasy, której to przeładowanie dotyczy. Bardzo ładnie jest to wytłumaczone na stronach MSDN.

Kopiuj
using System;

public struct Complex 
{
   public int real;
   public int imaginary;

   public Complex(int real, int imaginary) 
   {
      this.real = real;
      this.imaginary = imaginary;
   }

   // Declare which operator to overload (+), the types 
   // that can be added (two Complex objects), and the 
   // return type (Complex):
   public static Complex operator +(Complex c1, Complex c2) 
   {
      return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
   }
   // Override the ToString method to display an complex number in the suitable format:
   public override string ToString()
   {
      return(String.Format("{0} + {1}i", real, imaginary));
   }

   public static void Main() 
   {
      Complex num1 = new Complex(2,3);
      Complex num2 = new Complex(3,4);

      // Add two Complex objects (num1 and num2) through the
      // overloaded plus operator:
      Complex sum = num1 + num2;

     // Print the numbers and the sum using the overriden ToString method:
      Console.WriteLine("First complex number:  {0}",num1);
      Console.WriteLine("Second complex number: {0}",num2);
      Console.WriteLine("The sum of the two numbers: {0}",sum);
 
   }
}

https://ideone.com/vFPy8v
https://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx - stąd też powyższy przykład

Resumując takim rzeczom jak friend mówimy w C# stanowczo nie.

PS: Nie sugerować się tym, że składowe imaginary oraz real są publiczne. Równie dobrze można zamienić je na prywatne.

edytowany 2x, ostatnio: grzesiek51114
katelx
  • Rejestracja:około 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Hong Kong
0
Sarrus napisał(a):

Przeładowanie operatorów ma swoje ograniczenia. Inaczej niż w C++ zrobisz tak obiekt > 1, ale już nie zrobisz tak: 1 > obiekt, ponieważ funkcja przeładowująca jest elementem składowym klasy.

nie do konca masz racje, albo cie nie zrozumialam:

Kopiuj
using System;

public class Test
{
	//calkiem przydatna klasa, kazda intancja jest wieksza od dowolnego inta :)
	public sealed class C
	{
		public static bool operator<(C c, int i)
		{
			return false;
		}
		public static bool operator<(int i, C c)
		{
			return true;
		}
	    public static bool operator>(C c, int i)
		{
			return true;
		}
		public static bool operator>(int i, C c)
		{
			return false;
		}
	}
	
	public static void Main()
	{
		var c = new C();
		Console.WriteLine(1 < c);
		Console.WriteLine(1 > c);
		Console.WriteLine(c < 1);
		Console.WriteLine(c > 1);
	}
}
Sarrus napisał(a):

Przed przeładowywaniem operatorów trzeba się dobrze zastanowić czy aby na pewno jest to tobie potrzebne. Ja w praktyce zawodowej jeszcze przeładowania nie potrzebowałem.

poza typami wbudowanymi mysle ze zarowno operatory jak i customowe konwersje wprowadzaja wiecej szkod niz realnej wartosci.

imo wprowadzenie selektywnego lamania enkapsulacji (lub jak niektorzy to nazywaja 'lepszej kontroli') byloby kompletnie zbedne, juz protected internal wydaje mi sie przerostem formy nad trescia ;) tak naprawde wprowadza to niepotrzebny zamet i prawie zawsze wynika to ze zlego zaplanowania relacji miedzy klasami

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.