UPDATED:
Задачу реализации дружественной функции можно решить, если целевой класс будет
partial:
using System;
namespace FriendFunctionExample
{
public partial class TargetClass
{
public TargetClass(int state)
{
privateState = state;
}
private int privateState = int.MaxValue;
protected int targetNonPublicField = -1;
public string Report() { return $"My protected value is {targetNonPublicField}"; }
public object NativeInterfaceMethod01() { return new object(); }
public int NativeInterfaceMethod02() { return 7; }
public float NativeInterfaceMethod03() { return 3.14f; }
}
}
namespace FriendFunctionExample
{
interface IExtendedTargetClass
{
int PrivateState { get; set; }
int TargetNonPublicField { get; set; }
}
public partial class TargetClass : IExtendedTargetClass
{
public int PrivateState { get => privateState; set => privateState = value; }
public int TargetNonPublicField { get => targetNonPublicField; set => targetNonPublicField = value; }
}
class FriendFunctionHandler
{
private IExtendedTargetClass target;
public FriendFunctionHandler(IExtendedTargetClass target)
{
this.target = target;
}
public string DoSomethingAndReport(int number)
{
FriendFuncion(number);
return $"Set target protected value to 42 by friend function;";
}
private void FriendFuncion(int value) // set new value
{
target.TargetNonPublicField = value;
}
}
class FriendFunctionExample
{
static void Main(string[] args)
{
Console.WriteLine(nameof(FriendFunctionExample));
int initValue = 777;
var target = new TargetClass(initValue);
var ffh = new FriendFunctionHandler(target);
Console.WriteLine(target.Report());
Console.WriteLine(ffh.DoSomethingAndReport(42));
Console.WriteLine(target.Report());
Console.ReadLine();
}
}
}
FriendFunctionExample
My protected value is -1
Set target protected value to 42 by friend function;
My protected value is 42
OLD:
- свободных функций нет, но это быть статический класс с нужным методом,
- дружественную функцию можно реализовать через вызов
метода расширения, а излишнюю открылось функции закрыть через
internal