如果替代函数名称使API更明显,放弃getter和setter的"getMyValue()"和"setMyValue()"模式是否合适?
例如,假设我在C++中有这个类:
public class SomeClass {
private:
bool mIsVisible;
public:
void draw();
void erase();
}
Run Code Online (Sandbox Code Playgroud)
我可以添加函数来获取/设置"mIsVisible",如下所示:
bool getVisible() { return mIsVisible; };
void setVisible(bool visible) {
if (!mIsVisible && visible) {
draw();
} else if (mIsVisible && !visible) {
erase();
}
mIsVisible = visible;
Run Code Online (Sandbox Code Playgroud)
}
Run Code Online (Sandbox Code Playgroud)
但是,同样可以使用以下方法:
bool isVisible() { return mIsVisible; };
void show() {
if (!mIsVisible) {
mIsVisible = true;
draw();
}
}
void hide() {
if (mIsVisible) {
mIsVisible = false;
erase();
}
}
Run Code Online (Sandbox Code Playgroud)
简而言之,有一个"setVisible(bool)"方法,还是一对"show()"和"hide()"方法更好?有会议,还是纯粹主观的?
在XAML中我可以这样写:
<Setter Property="PropertyName" Value="{Binding ...}" />
Run Code Online (Sandbox Code Playgroud)
我将如何在代码中执行此操作?我之前在代码中构造了绑定,但我似乎无法ValueProperty在Setter类上找到任何要传递给它的静态对象BindingOperations.SetBinding().
想知道是否可能,例如,如果我从TextBox中删除边框,并且我想在鼠标悬停时将其默认边框恢复.
<Style TargetType="TextBox">
<Setter Property="BorderBrush" Value="{x:Null}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="?????"/>
</Trigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用它,但最后隐藏边界似乎是一个坏主意,但问题仍然存在.(我知道在这种情况下,如果鼠标不在TextBox上,我可以将Trigger反转为仅删除边框)
我厌倦了在豆子里一直加入大量的吸气剂/杀菌剂.有没有一种简单的方法来使用注释来摆脱这种愚蠢的工作?或任何其他方式?第二个例子是我希望运行的简短版本,因为不需要封装我的成员(尽管在另一个上下文中它可能是必要的).在我的现实世界中,我必须访问大约15个类,每个类中有大约10个数据成员,这将产生300个无用的setter/getter.
示例TestPerson.java(有效):
public class TestPerson {
public String firstName;
public String lastName;
public TestPerson() {
firstName = "Hugo";
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
示例TestPerson.java(不起作用):
public class TestPerson {
public String firstName;
public String lastName;
public TestPerson() {
firstName = "Hugo";
}
}
Run Code Online (Sandbox Code Playgroud)
示例test.jsp
<jsp:useBean id="testperson" class="test.TestPerson" scope="request" />
<html>
<head><title>Test</title></head>
<body> …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用__setattr__和__getattr__提供自定义属性访问的python类.
但是,某些属性无法以通用方式处理,因此我希望使用描述符.
出现的问题是,对于描述符,__get__将调用描述符以支持实例__getattr__,但是当分配给属性时,__setattr__将调用以支持描述符__set__.
一个例子:
class MyDesc(object):
def __init__(self):
self.val = None
def __get__(self, instance, owner):
print "MyDesc.__get__"
return self.val
def __set__(self, instance, value):
print "MyDesc.__set__"
self.val = value
class MyObj(object):
foo = MyDesc()
def __init__(self, bar):
object.__setattr__(self, 'names', dict(
bar=bar,
))
object.__setattr__(self, 'new_names', dict())
def __setattr__(self, name, value):
print "MyObj.__setattr__ for %s" % name
self.new_names[name] = value
def __getattr__(self, name):
print "MyObj.__getattr__ for %s" % name
if name …Run Code Online (Sandbox Code Playgroud) 我知道通常你使用NSStrings的副本,这样你的属性就像你分配它时一样保持相同的价值,即使试图在其他地方重新设置它.
但我很难完全理解这个概念.这不适用于任何类型的对象(不仅仅是NSStrings)吗?
所以我的问题是,"我应该将什么样的属性设置为'复制',为什么?"
如果你有多个属性在setter中实现相同的方法,有没有办法让它成为默认setter的一部分?
如果我有多个属性Filter()在设置时调用它,是否有办法将其推入"基本setter",这样我就不必Filter()在每个setter中都有调用?
private string _MyVal1;
public string MyVal1 {
get {
return _MyVal1;
}
set {
_MyVal1 = value;
Filter();
OnPropertyChanged("MyVal1");
}
}
private string _MyVal2;
public string MyVal2 {
get {
return _MyVal2;
}
set {
_MyVal2 = value;
Filter();
OnPropertyChanged("MyVal2");
}
}
private string _MyValN;
public string MyValN {
get {
return _MyValN;
}
set {
_MyValN = value;
Filter();
OnPropertyChanged("MyValN");
}
}
Run Code Online (Sandbox Code Playgroud)
所以它变成了这样:
private string _MyValN;
public string MyValN {
get {
return …Run Code Online (Sandbox Code Playgroud) 得到一个我遇到的问题
public class Student{
private String studentNumber;
private String studentName;
private double studentResult;
public Student (String aNumber, String aName){
setStudentNumber(aNumber);
setStudentName(aName);
setStudentResult(0);
}
// The standard getter and setter method are define here.
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中使用setter方法的目的是什么?并且使用setStudentResult(0),我们需要另一个实例变量吗?
更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.
今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.
一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个override旧get方法的桥接方法.
这是一些无法修改的任意预先存在的类型结构的代码.
public abstract class A
{
public abstract int X { get; }
}
public class B : A
{
public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)
我们想编写这段代码,但不会编译.
public class C : B // won't compile: X can't have a 'set' method
{
private int _x;
public override int X …Run Code Online (Sandbox Code Playgroud) 我下面有一个简单的课程
import Foundation
public class UsefulClass: NSObject{
var test:NSNumber{
get{return self.test}
set{
println(newValue)
self.test = newValue
}
}
override init() {
super.init()
self.test = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里初始化它
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var testClass = UsefulClass()
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于EXC_BAD_ACCESS代码= 2,它会导致xcode打印出200 5s然后崩溃.为什么会发生这种情况?
setter ×10
c# ×3
getter ×3
java ×2
wpf ×2
attributes ×1
binding ×1
c++ ×1
code-behind ×1
coding-style ×1
constructor ×1
descriptor ×1
ios ×1
ios5 ×1
methods ×1
objective-c ×1
overriding ×1
properties ×1
python ×1
readonly ×1
styles ×1
swift ×1
wpf-controls ×1