是否可以用C#以外的语言实现属性?

Phi*_*l H 2 javascript php c# python properties

在最近的一次C#和WPF中,我喜欢C#的属性:

public double length_inches
{
    get { return length_metres * 39.0; }
    set { length_metres = value/39.0; }
}
Run Code Online (Sandbox Code Playgroud)

当然,注意到length_metres可能会从字段变为属性,而代码无需关心.WPF还可以非常愉快地将UI元素绑定到对象属性.

当我第一次学习类和对象时,我认为有一种方法可以做到,因为它看起来很明显!隐藏类中复杂性的关键在于您不再需要关心存储的内容.但直到现在才看到它.

有趣的是,我第一次看到它在VB.Net中完成.OO纯度的前沿.

问题是,我可以重新使用我经常使用的其他语言的属性,比如javascript,python,php吗?在javascript中,如果我将一个变量设置为一个闭包,我不会再次获得闭包,而不是它的结果吗?

Jar*_*die 19

Python绝对支持属性:

class Foo(object):

    def get_length_inches(self):
        return self.length_meters * 39.0

    def set_length_inches(self, val):
        self.length_meters = val/39.0

    length_inches = property(get_length_inches, set_length_inches)
Run Code Online (Sandbox Code Playgroud)

从Python 2.5开始,只读属性存在语法糖,2.6中也存在可写糖:

class Foo(object):

    # 2.5 or later
    @property
    def length_inches(self):
        return self.length_meters * 39.0

    # 2.6 or later
    @length_inches.setter
    def length_inches(self, val):
        self.length_meters = val/39.0
Run Code Online (Sandbox Code Playgroud)


Zac*_*ach 8

JavaScript中:

var object = {
  // .. other property definitions ...
  get length_inches(){ return this.length_metres * 39.0; },
  set length_inches(value){ this.length_metres = value/39.0; }
};
Run Code Online (Sandbox Code Playgroud)


Bri*_*sen 6

在C#中,属性主要只是一个编译器功能.编译器生成特殊方法get_PropertyNameset_PropertyName计算调用等.它还设置specialname了方法的IL属性.

如果您选择的语言支持某种类型的预处理器,您可以实现类似的功能,但除此之外您几乎完全坚持使用的功能.

当然,如果您正在实现自己的.NET语言,那么您也可以执行C#编译器所做的事情.

由于实现细节,字段和属性之间实际上存在细微差别.有关详情,请参阅此问题.