Извините, немного изменил ваш код, чтобы сделать его не таким абстрактным.
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public class Color
{
public string Name { get; set; } = "blue";
}
public abstract class Cup
{
protected Color Color { get; private set; }
protected Cup(Color color)
{
Color = color;
}
public string ColorName
{
get => Color.Name;
/// ATTENTION:
/// Try to avoid setting properties of shared properties
/// this will lead to errors and is very difficult to
/// find in debugging or searching for potential errors
set => Color.Name = value;
}
}
public class TeaCup : Cup
{
public TeaCup() : base(null) { }
public TeaCup(Color color) : base(color) { }
}
public class CoffeeCup : Cup
{
public CoffeeCup() : base(null) { }
public CoffeeCup(Color color) : base(color) { }
}
private static void Main(string[] args)
{
var color = new Color();
var cup1 = new TeaCup(color);
var cup2 = new CoffeeCup(color);
Console.WriteLine("color = {0}", color.Name);
cup1.ColorName = "red";
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);
cup2.ColorName = "green";
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);
}
}
Если вы сейчас измените Color.Name
, он будет изменен в каждой Cup
реализации, которая была создана с тем же color
. См. Комментарий в коде.
Я думаю, что лучше явно установить Color.Name
непосредственно для экземпляра Color
, не передаваемого другим экземпляром упаковки (Cup
).
Первый подход: ссылка .netfiddle, чтобы попробовать это
Так что, по моему мнению, лучший подход - внедрить нечто вроде поставщика / службы SharedProperties (Color
)
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public interface IColorProvider
{
string GetName();
}
public class ColorProvider : IColorProvider
{
private string _name = "blue";
public void SetName(string name) { _name = name; }
public string GetName() { return _name; }
}
public abstract class Cup
{
private readonly IColorProvider _colorProvider;
protected Cup(IColorProvider colorProvider)
{
_colorProvider = colorProvider;
}
public string ColorName {
get => _colorProvider.GetName();
}
}
public class TeaCup : Cup
{
public TeaCup() : base(null) { }
public TeaCup(IColorProvider colorProvider) : base(colorProvider) { }
}
public class CoffeeCup : Cup
{
public CoffeeCup() : base(null) { }
public CoffeeCup(IColorProvider colorProvider) : base(colorProvider) { }
}
private static void Main(string[] args)
{
var colorProvider = new ColorProvider();
var cup1 = new TeaCup(colorProvider);
var cup2 = new CoffeeCup(colorProvider);
Console.WriteLine("color = {0}", colorProvider.GetName());
colorProvider.SetName( "red");
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);
colorProvider.SetName( "green");
Console.WriteLine("cup1.ColorName = {0}", cup1.ColorName);
Console.WriteLine("cup2.ColorName = {0}", cup2.ColorName);
}
}
Второй подход: ссылка .netfiddle для проверки