以下是MSDN在何时使用静态类时要说的内容:
Run Code Online (Sandbox Code Playgroud)static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... }
使用静态类作为与特定对象无关的方法的组织单位.此外,静态类可以使您的实现更简单,更快,因为您不必创建对象来调用其方法.以有意义的方式组织类中的方法很有用,例如System命名空间中Math类的方法.
对我来说,这个例子似乎并没有涵盖静态类的很多可能的使用场景.在过去,我已经将静态类用于相关函数的无状态套件,但这就是它.那么,在什么情况下应该(而且不应该)将一个类声明为静态?
我只是在互联网上阅读一些Scala教程,并注意到在一些例子中,在示例的开头声明了一个对象.
class
和object
Scala有什么区别?
采访者问:我们可以实例化一个抽象类吗?我说,不,他告诉我 - 错,我们可以.
我对此有点争论.然后他告诉我自己在家里试试.
abstract class my {
public void mymethod() {
System.out.print("Abstract");
}
}
class poly {
public static void main(String a[]) {
my m = new my() {};
m.mymethod();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我正在创建我的类的实例并调用抽象类的方法.有人可以向我解释一下吗?在我的采访中我真的错了吗?
在Python中创建一个简单的对象层次结构时,我希望能够从派生类中调用父类的方法.在Perl和Java中,有一个关键字this(super
).在Perl中,我可能会这样做:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
Run Code Online (Sandbox Code Playgroud)
在python中,似乎我必须从子级明确命名父类.在上面的例子中,我必须做类似的事情Foo::frotz()
.
这似乎不对,因为这种行为使得很难制作深层次结构.如果孩子需要知道哪个类定义了一个继承的方法,那么就会产生各种各样的信息痛苦.
这是python中的实际限制,是我理解中的差距还是两者兼而有之?
我来自Java世界并阅读Bruce Eckels的Python 3模式,食谱和成语.
在阅读类时,接着说在Python中没有必要声明实例变量.你只需在构造函数中使用它们,然后繁荣,它们就在那里.
例如:
class Simple:
def __init__(self, s):
print("inside the simple constructor")
self.s = s
def show(self):
print(self.s)
def showMsg(self, msg):
print(msg + ':', self.show())
Run Code Online (Sandbox Code Playgroud)
如果这是真的,那么类的任何对象都Simple
可以只改变s
类外的变量值.
例如:
if __name__ == "__main__":
x = Simple("constructor argument")
x.s = "test15" # this changes the value
x.show()
x.showMsg("A message")
Run Code Online (Sandbox Code Playgroud)
在Java中,我们学习了有关公共/私有/受保护变量的知识.这些关键字是有意义的,因为有时你想要类中的变量,类外没有人可以访问.
为什么Python中不需要这样做?
我正在学习Python中的绳索.当我尝试Foobar
使用该print()
函数打印类的对象时,我得到如下输出:
<__main__.Foobar instance at 0x7ff2a18c>
Run Code Online (Sandbox Code Playgroud)
有没有办法可以设置类及其对象的打印行为(或字符串表示)?例如,当我调用类对象时,我想以某种格式打印其数据成员.如何在Python中实现这一点?print()
如果您熟悉C++类,则可以通过为类ostream
添加friend ostream& operator << (ostream&, const Foobar&)
方法来实现上述标准.
目前在ES5中,我们很多人在框架中使用以下模式来创建类和类变量,这很舒服:
// ES 5
FrameWork.Class({
variable: 'string',
variable2: true,
init: function(){
},
addItem: function(){
}
});
Run Code Online (Sandbox Code Playgroud)
在ES6中,您可以本机创建类,但没有选项可以使用类变量:
// ES6
class MyClass {
const MY_CONST = 'string'; // <-- this is not possible in ES6
constructor(){
this.MY_CONST;
}
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,上面的代码不起作用,因为类只能包含方法.
我知道我可以this.myVar = true
在constructor
...但我不想"垃圾"我的构造,特别是当我有一个更大的类20-30 +参数.
我正在考虑处理这个问题的许多方法,但还没有找到任何好的方法.(例如:创建一个ClassConfig
处理程序,并传递一个parameter
与该类分开声明的对象.然后处理程序将附加到该类.我正在考虑WeakMaps
以某种方式集成.)
你有什么样的想法来处理这种情况?
我在第三方设计的设计很差JAR
,我需要访问其中一个私有字段.例如,为什么我需要选择私人领域是否有必要?
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;
Run Code Online (Sandbox Code Playgroud)
我如何使用反射来获得价值stuffIWant
?
使用Swift,来自Java背景,为什么要选择Struct而不是Class?看起来它们是相同的,使用Struct提供更少的功能.为什么选择呢?
class ×10
object ×4
python ×3
c# ×2
java ×2
private ×2
abstract ×1
architecture ×1
ecmascript-6 ×1
field ×1
inheritance ×1
javascript ×1
oop ×1
printing ×1
reflection ×1
scala ×1
static ×1
struct ×1
swift ×1