Objects and Classes(对象和类)
用 class 关键字后面跟一个类名来创建一个class,在一个类中声明 常亮或变量,他存在于当前类的上下文,函数的方法是同样的
let numberOfSidesLet = 1
func simpleDescription() -> String
{
return "A shape with \(numberOfSides) \(numberOfSidesLet) sides."
}
通过括号的方式来创建一个类实例,使用点语法来访问该实例的属性和方法
shape.numberOfSides=10
var str = shape.simpleDescription()
println(str)
吐槽一下,不知道是xcode6 bate版本问题还是什么原因,写代码的提示功能特别差
这个版本的一个重要的修改:在创建的时候设置初始值的项,使用init来创建,如下:
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比较相似),如果没有重载,则会提示错误
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方法
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,例如:下面的类永远保证三角形的边长等于正方形的边长
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
简要使用介绍
@RenderSection在母版页中占个位,然后让使用此母版页的子页自己去呈现他们的Section。
在母版页_Layout.cshtml中定义@RenderSection("Section名")
<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);
总结
- 从设计模式的角度来说,section的实现采用了模板方法(Template Method);
- 同Web Form对比的话,很像PlaceHolder,用于先占位,后替换;
- 更加广一点来说,与String.Format() 的思维是一致的;
- 当然,Razor引擎一直想表达的就是这种思想,只不过section偏向将HTML当做一个子部分(partial)。
本文链接:MVC RenderSection,转载请注明。
没有评论:
发表评论