抽象类中定义静态方法

简介:

    一直认为抽象类不能实例化,所以就没有想过用直接调用方法,而是实例化它的子类,用子类调用方法,
 没想到啊,在抽象类中定义static方法不就可以了吗,static方法属于类,不需要实例化。

using System;
using System.Reflection;

namespace AbstractFactory
{
 /// <summary>
 /// Factory类
 /// </summary>
 public abstract class AbstractFactory
 {
  
  public static AbstractFactory GetInstance()
  {
   string factoryName = Constant.STR_FACTORYNAME.ToString();

   AbstractFactory instance;

   if(factoryName != "")

                //AbstractFactory表示程序集的名称 ;factoryName表示要加载的类
                instance = (AbstractFactory)Assembly.Load("AbstractFactory").CreateInstance(factoryName);
   else
    instance = null;

   return instance;
  }


  public abstract Tax CreateTax();

  public abstract Bonus CreateBonus();
 }
}


using System;

namespace AbstractFactory
{
 /// <summary>
 /// 客户端程序调用
 /// </summary>
 public class Calculator 
 {
  public static void Main(string[] args) 
  {
            //GetInstance不是static方法
            //AbstractFactory abstractFactory = new ChineseFactory().GetInstance();
            //double bonusValue = abstractFactory.CreateBonus().Calculate();
            //double taxValue = abstractFactory.CreateTax().Calculate();

            //GetInstance是static方法
            double bonusValue = AbstractFactory.GetInstance().CreateBonus().Calculate();
            double taxValue = AbstractFactory.GetInstance().CreateTax().Calculate();
            double salary = 4000 + bonusValue - taxValue; 
            Console.WriteLine("Salary is:" + salary);
            Console.ReadLine();

          
  }
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// ChineseFactory类
 /// </summary>
 public class ChineseFactory:AbstractFactory
 {
  public override Tax CreateTax()
  {
   return new ChineseTax();
  }

  public override Bonus CreateBonus()
  {
   return new ChineseBonus();
  }
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// AmericanFactory类
 /// </summary>
 public class AmericanFactory:AbstractFactory
 {
  public override Tax CreateTax()
  {
   return new AmericanTax();
  }

  public override Bonus CreateBonus()
  {
            return new AmericanBonus();
  }
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// 计算中国个人奖金
 /// </summary>
 public class ChineseBonus:Bonus
 {
  public override double Calculate()
  {
   return Constant.BASE_SALARY * 0.1;
  }
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// 计算美国奖金
 /// </summary>
 public class AmericanBonus:Bonus
 {
  public override double Calculate()
  {
   return Constant.BASE_SALARY * 0.1;
  }
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// 计算美国个人所得税
 /// </summary>
 public class AmericanTax:Tax
 {
  public override double Calculate()
  {
   return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;
  }
 }
}

using System;

namespace AbstractFactory

 /// <summary>
 /// 计算中国个人所得税
 /// </summary>
 public class ChineseTax:Tax
 {
  public override double Calculate()
  {
   return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.1)) * 0.4;
  }
 }
}

using System;
using System.Configuration;

namespace AbstractFactory
{
 /// <summary>
 /// 公用的常量
 /// </summary>
 public class Constant
 {
  public static double BASE_SALARY = 4000;

  public static string STR_FACTORYNAME = ConfigurationSettings.AppSettings["factoryName"];
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// 个人所得税抽象类
 /// </summary>
 public abstract class Tax
 {
  public abstract double Calculate();
 }
}

using System;

namespace AbstractFactory
{
 /// <summary>
 /// 奖金抽象类
 /// </summary>
 public abstract class Bonus
 {
  public abstract double Calculate();
 }
}

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <appSettings>
  <add key="factoryName" value="AbstractFactory.ChineseFactory"></add>
 </appSettings>
 
</configuration>


本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2010/09/08/2087995.html

目录
相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
2月前
|
C#
C#中的类和继承
C#中的类和继承
37 6
|
5月前
|
Java
22、接口与抽象类、匿名类的介绍
22、接口与抽象类、匿名类的介绍
37 0
|
5月前
|
Java
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
【Java基础】类名、抽象类、接口名的参数传递及成员内部类、局部内部类和匿名内部类的使用
67 0
C#中抽象方法与虚方法的区别
C#中抽象方法与虚方法的区别
抽象类和普通类的区别
抽象类和普通类的区别
110 0
继承类的方法
继承类的方法
108 0
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
525 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
|
C++
C++类的静态方法
C++类的静态方法
79 0