2014年6月6日星期五

A Swift Tour(4) - Objects and Classes - 一米,希望

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
A Swift Tour(4) - Objects and Classes - 一米,希望  阅读原文»

Objects and Classes(对象和类)

用 class 关键字后面跟一个类名来创建一个class,在一个类中声明 常亮或变量,他存在于当前类的上下文,函数的方法是同样的

var numberOfSides = 0
let numberOfSidesLet
= 1

func simpleDescription()
-> String
{
return "A shape with \(numberOfSides) \(numberOfSidesLet) sides."
}

通过括号的方式来创建一个类实例,使用点语法来访问该实例的属性和方法

var shape = Shape()
shape.numberOfSides
=10
var str
= shape.simpleDescription()
println(str)

吐槽一下,不知道是xcode6 bate版本问题还是什么原因,写代码的提示功能特别差

这个版本的一个重要的修改:在创建的时候设置初始值的项,使用init来创建,如下:

1 class Shape {
2
3 var name:String
4
5 init(name:String)
6 {
7 self.name = name
8 }
9
10 var numberOfSides = 0
11 let numberOfSidesLet = 1
12
13
14 func simpleDescription() -> String
15 {
16 return "A shape with \(numberOfSides) \(numberOfSidesLet) sides."
17 }
18 }

请注意 self 关键字用来区分 属性name 和 参数 name(这个和oc中的还是一样)

如果你要释放一些对象,那么需要创建一个deinitializer,使用deinit来释放资源

子类和父类之间用 冒号分开,在继承标准的子类时,不需要声明,所以可以根据需要来忽略或者包括父类

子类重写父类的方法要使用overside关键字(C#,Java比较相似),如果没有重载,则会提示错误

class Square: Shape {

var sideLength: Double

init(sideLength:Double,name:String)
{
self.sideLength
= sideLength
super.init(name:name)
numberOfSides
= 4
}

func area()
-> Double
{
return sideLength * sideLength
}

override func simpleDescription() -> String
{
return "A square with sides of length \(sideLength)"
}
}

var square
= Square(sideLength:10.1,name:"my test")
square.area()
var str
= square.simpleDescription()
println(str)

除了简单的属性,属性也可以有getter 和 setter方法

1 class EquilateralTriangle: Shape {
2
3 var sideLength:Double = 0.0
4
5 init(sideLength:Double,name:String)
6 {
7 self.sideLength = sideLength
8 super.init(name:name)
9 numberOfSides=3
10 }
11
12 var perimeter:Double
13 {
14 get{
15 return 3.0*sideLength
16 }
17 set
18 {
19 sideLength = newValue/3.0
20 }
21 }
22
23 override func simpleDescription()->String
24 {
25 return "An equilateral triagle with sides of length \(sideLength)"
26 }
27 }
28 var triangle = EquilateralTriangle(sideLength:3.1,name:"a triangle")
29 println(triangle.perimeter)
30 triangle.perimeter = 9.9
31 println(triangle.sideLength)

在perimeter的setter方法中,新值得隐式名称是newValue,你可以在setter之后提供一个名字

初始化EquilateralTriangle类有三步:

1. 设置属性的值

2. 调用父类的构造方法(init)

3. 改变父类定义的属性值,其他的方法也可以在这里设置

如果你不需要计算属性,但是在setter之前或者之后执行,可以使用willSet和didSet,例如:下面的类永远保证三角形的边长等于正方形的边长

class TriangleAndSquare {

var triangle:EquilateralTriangle
{
willSet
{
square.sideLength
= newValue.sideLength
}
}

var square:Square
{
willSet
{
triangle.sideLength
= newValue.sideLength
}
}

init(size:Double,name:String)
{
square
= Square(sideLength:size,name:name)
triangle
= EquilateralTriangle(sideLength:size,name:name)
}
}

var triangleAndSquare
= TriangleAndSquare(size:10,name:"ray test sh
MVC RenderSection - _DN  阅读原文»

简要使用介绍

@RenderSection在母版页中占个位,然后让使用此母版页的子页自己去呈现他们的Section。

在母版页_Layout.cshtml中定义@RenderSection("Section名")

<body>
<div id="header">@{Html.RenderAction("Menu", "Global");}</div>
<div id="sideBar">
@RenderSection("SubMenu")
</div>
<div id="container">@RenderBody()</div>
<div id="footer">@{Html.RenderAction("Footer", "Global");}</div>
</body>

添加一个About.cshtml,使用_Layout.cshtml做母版页

然后就可以在About.cshtml中定义"SubMenu"要呈现的内容

@{
ViewBag.Title
= "About";
}

@section SubMenu{
Hello This
is a section implement in About View.
}
其中@section是Razor中的关键字

WebPageBase中的Section方法

WebPageBase充当表示 ASP.NET Razor 页的类的基类,即针对Razor页进行解析。主要的Section方法有:

//在布局页中(_Layout.cshtml),将呈现指定部分的内容。
public HelperResult RenderSection(string name);
public HelperResult RenderSection(string name, bool required);

//在布局页中,将呈现不在指定部分中的内容页部分。
public HelperResult RenderBody();
//该值指示是否在页中定义了指定部分
public bool IsSectionDefined(string name);

总结

  1. 从设计模式的角度来说,section的实现采用了模板方法(Template Method);
  2. 同Web Form对比的话,很像PlaceHolder,用于先占位,后替换
  3. 更加广一点来说,与String.Format() 的思维是一致的;
  4. 当然,Razor引擎一直想表达的就是这种思想,只不过section偏向将HTML当做一个子部分(partial)。

本文链接:MVC RenderSection,转载请注明。

阅读更多内容

没有评论:

发表评论