为接口属性提供一个非平凡的setter,但不是getter

时间:2012-10-29 00:45:32

标签: c# unity3d

对于我正在研究的Unity3d游戏,我有一种情况,我想要一个带有微不足道的getter的可读/可写属性,但是一个可以做更多工作的setter。我的代码如下所示:

// IColor.cs
interface IColor {
    Color colorPainted { get; set; }
}

// Player.cs
public class Player : Monobehaviour, IColor {
    // ...
    public Color colorPainted {
        get { }
        set {
            colorPainted = value;
            // some other code
        }
     // ...
    }
}

我不知道如何对get部分做些什么。我不能return colorPainted;,因为这会导致堆栈溢出。写入的代码将无法编译,因为我没有返回值。

我不是C#向导,但似乎我需要一个_colorPainted支持变量,并通过getset提供对它的访问权限。这看起来有点冗长 - 有没有更好的方法呢?在Objective-C中,我只是让getter未实现,但这似乎不起作用。

2 个答案:

答案 0 :(得分:3)

不幸的是在C#中没有办法解决它。您需要为该属性提供支持字段:

// Player.cs

private Color _colorPainted;

public class Player : Monobehaviour, IColor {
    // ...
    public Color colorPainted {
        get { return _colorPainted; }
        set {
            _colorPainted = value;
            // some other code
        }
     // ...
    }
}

答案 1 :(得分:2)

使用支持成员来保存值:

public class Player : Monobehaviour, IColor {
    // ...
    private Color _colorPainted;
    public Color colorPainted {
        get { return _colorPainted; }
        set {
            _colorPainted = value;
            // some other code
        }
     // ...
    }
}

在您无法返回属性本身的示例中,您的setter也将无法正常工作。同样的问题。基本上,当你写这个:

public Color colorPainted { get; set; }

真正写作的内容是这样,只有更短的时间:

private Color _colorPainted;
public Color colorPainted
{
    get { return _colorPainted; }
    set { _colorPainted = value; }
}

编译器只是为您处理支持字段,允许您以较短的方式编写它。但是当你走出那个较短的语法时,你必须自己管理支持字段。

由于支持字段是私有的,因此使用类或接口类型的任何代码都没有区别。