2010-11-15 43 views
0

创建C#公共类,以便满足下列条件:C#创建一个类,使得它不能被实例化,并满足以下条件:

  1. 类不能被实例化。
  2. 从类A功能可通过其它类被调用。

我试着这样说:

public abstract class A { 

    public static void fun() 
{ 
// do process. 
} 

} 


public class B : A 
{ 
// Now A can't be instantiated being abstract. 
// And you can call its function like this : 
A.fun(); 
} 

但我的回答是wrong.So,请帮助我。

回答

1

您可以创建一个类似如下,以满足您的目标

public class A 
     { 
      private A() 
      {   
      } 

      public static A GetA() 
      { 
       return new A(); 
      } 

       public void Foo() 
       {} 
     } 

     public class B 
     { 
      public void Foo2() 
      { 
       A a = A.GetA(); 
         a.Foo(); 
      } 
     } 

制作一个私人的构造函数从另一个类实例吧吧。而静态方法GetA将会返回一个私有化的对象,你可以从任何类中使用它。

+0

对我帮助很大!但它有过度使用静态类的有什么区别,如如果你使用静态类由@Saeed – Pratik 2010-11-15 06:36:45

+0

给出的答案做了,在该类的每个方法必须是静态的,它是一种约束。但是如果你使用这种模式,你不必拘泥于这个约束。 – 2010-11-15 07:19:23

+0

在这种情况下,你会用'A.GetA'方法实例类,你也可以有这个太多的情况下,你在做什么?创建私有构造函数为什么?如果你想创建这样的事情,你应该有理由叫什么区别'一个一个新= A()'和'A中的= A.GetA()',如果你让类的构造函数私有的,应该有一定的原因,例如,使它单身。或者使其从其他类的访问中获得私有权,但您可以在任何地方访问它。 – 2010-11-15 10:41:12

1

如果您不喜欢允许使用静态类来实例化它,那么您可以使用静态类,它的最佳示例是Math类,并且如果您想要有单个实例,则可以使用单例。 MSDN示例:

public static class TemperatureConverter 
    { 
     public static double CelsiusToFahrenheit(string temperatureCelsius) 
     { 
      // Convert argument to double for calculations. 
      double celsius = System.Double.Parse(temperatureCelsius); 

      // Convert Celsius to Fahrenheit. 
      double fahrenheit = (celsius * 9/5) + 32; 

      return fahrenheit; 
     } 

     public static double FahrenheitToCelsius(string temperatureFahrenheit) 
     { 
      // Convert argument to double for calculations. 
      double fahrenheit = System.Double.Parse(temperatureFahrenheit); 

      // Convert Fahrenheit to Celsius. 
      double celsius = (fahrenheit - 32) * 5/9; 

      return celsius; 
     } 
    } 

class TestTemperatureConverter 
{ 
    static void Main() 
    { 
     System.Console.WriteLine("Please select the convertor direction"); 
     System.Console.WriteLine("1. From Celsius to Fahrenheit."); 
     System.Console.WriteLine("2. From Fahrenheit to Celsius."); 
     System.Console.Write(":"); 

     string selection = System.Console.ReadLine(); 
     double F, C = 0; 

     switch (selection) 
     { 
      case "1": 
       System.Console.Write("Please enter the Celsius temperature: "); 
       F = TemperatureConverter.CelsiusToFahrenheit(System.Console.ReadLine()); 
       System.Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F); 
       break; 

      case "2": 
       System.Console.Write("Please enter the Fahrenheit temperature: "); 
       C = TemperatureConverter.FahrenheitToCelsius(System.Console.ReadLine()); 
       System.Console.WriteLine("Temperature in Celsius: {0:F2}", C); 
       break; 

      default: 
       System.Console.WriteLine("Please select a convertor."); 
       break; 
     } 
    } 
} 

和创建类单做到这一点:

public sealed class MyClass 
{ 
    MyClass() 
    { 
    } 

    public static MyClass Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly MyClass instance = new MyClass(); 
    } 
} 
+0

'内部静态只读MyClass的实例=新辛格尔顿();'凡'新的Singleton()'从哪里来? – 2010-11-15 10:56:44

相关问题