override

密封类

送分小仙女□ 提交于 2020-01-23 14:11:07
对一个类应用 sealed 修饰符时, 此修饰符会阻止其他类从该类继承。 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承 。 复制 class A {} sealed class B : A {} 还可以在重写基类中的虚方法或虚属性的方法或属性上使用 sealed 修饰符。 这将使您能够允许类从您的类继承,并防止它们重写特定的虚方法或虚属性。 示例 在下面的示例中, Z 从 Y 继承,但 Z 无法重写在 X 中声明并在 Y 中密封的虚函数 F 。 C# 复制 class X { protected virtual void F() { Console.WriteLine("X.F"); } protected virtual void F2() { Console.WriteLine("X.F2"); } } class Y : X { sealed protected override void F() { Console.WriteLine("Y.F"); } protected override void F2() { Console.WriteLine("X.F3"); } } class Z : Y { // Attempting to override F causes compiler error CS0239. // protected

C#密封类

旧巷老猫 提交于 2020-01-23 14:09:22
C#密封类 一、密封类 1. 密封类的定义 如果我们不希望自己编写的类被继承;如果有的类已经没有再被继承的必要,这时,我们可以使用sealed修饰符在类中进行声明,以达到该类不能派生其它类的目的,该类就被称为密封类。 2. 密封类与抽象类 密封类不能同时又是抽象类,因为密封类不能用作基类、也不能被继承,而抽象类总是希望被继承的。 3. 什么情况下使用密封类 需要阻止其它程序员无意中继承该类的时候;在程序运行时需要起到优化效果的时候,可以使用密封类。 4. 示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class Program { sealed class A // 密封类。不能从该类再派生出其它类 { public int x; public int y; } static void Main(string[] args) { // C#密封类-www.baike369.com A a = new A(); a.x = 10; a.y = 20; Console.WriteLine("x = {0}; y = {1}", a.x, a.y); Console.ReadLine(); } } } 运行结果: x =

建造者模式

天涯浪子 提交于 2020-01-21 09:23:29
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。 #region 基本接口 interface Item { float price(); string name(); Packing packing(); } //包裹 interface Packing { string pack(); } #endregion #region 包裹类 class Wapper : Packing { public string pack() { return "wapper"; } } class Bottle:Packing { public string pack() { return "bottle"; } } #endregion #region

c#中的interface abstract与virtual

佐手、 提交于 2020-01-17 01:29:12
interface用来声明接口 1.只提供一些方法规约,不提供方法主体 如 public interface IPerson { void getName();//不包含方法主体 } 2.方法不能用public abstract等修饰,无字段变量,无构造函数。 3.方法可包含参数 如 public interface IPerson { void getAge(string s); } 一个例子(例1): public interface IPerson { IPerson(); //错误 不应有构造函数 string name; //错误 不应由字段变量 public void getIDcard();//错误 方法不应有Public Abstract...修饰符 void getName(); //right void getAge(string s); //right } 实现interface的类 1.与继承类的格式一致,如 public class Chinese:IPerson{} 2.必须实现interface中的各个方法 例2,继承例1 public class Chinese:IPerson { public Chinese(){} //添加构造 public void getName(){} //实现getName() public void getAge

c#中的interface abstract与virtual

余生长醉 提交于 2020-01-17 01:15:51
interface用来声明接口 1.只提供一些方法规约,不提供方法主体 如 public interface IPerson { void getName();//不包含方法主体 } 2.方法不能用public abstract等修饰,无字段变量,无构造函数。 3.方法可包含参数 如 public interface IPerson { void getAge(string s); } 一个例子(例1): public interface IPerson { IPerson(); //错误 string name; //错误 public void getIDcard();//错误 void getName(); //right void getAge(string s); //right } 实现interface的类 1.与继承类的格式一致,如 public class Chinese:IPerson{} 2.必须实现interface中的各个方法 例2,继承例1 public class Chinese:IPerson { public Chinese(){} //添加构造 public void getName(){} //实现getName() public void getAge(string s){} //实现getAge() } abstract声明抽象类、抽象方法

c#中的interface abstract与virtual

本秂侑毒 提交于 2020-01-17 01:14:16
interface用来声明接口 1.只提供一些方法规约,不提供方法主体 如 public interface IPerson { void getName();//不包含方法主体 } 2.方法不能用public abstract等修饰,无字段变量,无构造函数。 3.方法可包含参数 如 public interface IPerson { void getAge(string s); } 一个例子(例1): public interface IPerson { IPerson(); //错误 string name; //错误 public void getIDcard();//错误 void getName(); //right void getAge(string s); //right } 实现interface的类 1.与继承类的格式一致,如 public class Chinese:IPerson{} 2.必须实现interface中的各个方法 例2,继承例1 public class Chinese:IPerson { public Chinese(){} //添加构造 public void getName(){} //实现getName() public void getAge(string s){} //实现getAge() } abstract声明抽象类、抽象方法

new在c#方法中的使用

坚强是说给别人听的谎言 提交于 2020-01-16 18:46:40
new在c#中有三种用法: 1.实例化对象 2.泛型约束 3.用在方法前。new和override的区别在于:override用于重写父类的方法;new用于隐藏方法,它调用的方法来自于申明的类,如果申明的是父类,调用父类方法,声明的是子类,则调用子类的方法,如果申明的对象时匿名的,则默认调用子类的方法。 public class New_Study { public virtual void Method1() { Console.WriteLine("PMethod1"); } public virtual void Method2() { Console.WriteLine("PMethod2"); } } public class ChildClass:New_Study { public override void Method1() { Console.WriteLine("override CMethod1"); } public new void Method2() { Console.WriteLine("new CMethod2"); } } [TestFixture] public class New_Study_Test { [Test] public void TestNew() { New_Study parent1 = new ChildClass();

LiveData

99封情书 提交于 2020-01-14 17:54:41
LiveData是什么? 具有生命周期感知的、可观察的数据持有者 基本使用 MutableLiveData<String> mutableLiveData = new MutableLiveData<>(); mutableLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable final String s) { Log.e("zhoujian", "onChanged:" + s); } }); //setValue: 在主线程调用 //postValue: 可以在子线程中调用 mutableLiveData.postValue("测试数据"); 01-14 15:01:13.562 24808-24808/com.zhoujian.lifecycledemo E/zhoujian: onChanged:测试数据 map MutableLiveData<String> mutableLiveData = new MutableLiveData<>(); mutableLiveData.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable final

Android中CheckBox的SetOnClickListener与setOnCheckedChangeListener的区别

怎甘沉沦 提交于 2020-01-14 14:42:33
package com.itcast.radiobutton; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; private Button btn; private CheckBox cb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R

实现多线程的正确姿势

孤街醉人 提交于 2020-01-13 21:57:49
一:实现多线程的方法有几种? Oracle官网的文档已经告诉了我们: 方法一:继承Thread类 public class ThreadStyle extends Thread { public static void main ( String [ ] args ) { new ThreadStyle ( ) . start ( ) ; } @Override public void run ( ) { System . out . println ( "用Thread类实现线程" ) ; } } 方法二:实现Runnable接口 public class RunnableStyle implements Runnable { public static void main ( String [ ] args ) { Thread thread = new Thread ( new RunnableStyle ( ) ) ; thread . start ( ) ; } @Override public void run ( ) { System . out . println ( "用runnable方法实现线程" ) ; } } 二:两种方法的对比 方法二(实现Runnable接口)更好,why? 那我们分析一下方法一的缺点 从代码架构的角度考虑,具体执行的任务,也就是run