Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言创建一个类,这样它就可以';不能实例化并满足以下条件:_C#_Oop - Fatal编程技术网

C# 用C语言创建一个类,这样它就可以';不能实例化并满足以下条件:

C# 用C语言创建一个类,这样它就可以';不能实例化并满足以下条件:,c#,oop,C#,Oop,在C#中创建公共类,以满足以下条件: 无法实例化该类 该类中的函数可以由其他类调用 我试着这样做: 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();

在C#中创建公共类,以满足以下条件:

  • 无法实例化该类
  • 该类中的函数可以由其他类调用
  • 我试着这样做:

    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();
    }
    

    但是我的答案是错误的。所以,请帮助我。

    您可以创建一个如下所示的类来实现您的目标

        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将返回一个安装它的私有对象,您可以从任何类使用它。

    如果您不喜欢使用static类实例化它,可以使用static类,最好的示例是
    Math
    类,如果您想拥有单个实例,也可以使用singleton。 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;
            }
        }
    }
    
    要创建类singleton,请执行以下操作:

    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();
        }
    }
    

    帮了我大忙!但是它与使用静态类有什么区别呢,正如@saeed给出的答案所示,如果使用静态类,该类中的每个方法都必须是静态的,这是一种约束。但是如果你使用这个模式,你就不必拘泥于这个约束。在这种情况下,你要通过
    A.GetA
    方法实例化这个类,也可能有太多的实例,你在做什么?创建私有构造函数为什么?如果你想创建这样一个东西,你应该有理由调用
    a=newa()
    a=a.GetA()
    之间有什么区别,如果你让类构造函数私有,应该有一些理由,比如让它成为单例。或者从其他类访问时将其设置为私有,但您可以随时随地访问它。@Saeed,您可能一开始就误解了它,我并没有给出解决实际问题的方法。OP问了一个符合他问题条件的例子,我给了他一个例子,当然这不是唯一的解决方案。OP的唯一目的是在多种方式之间进行选择(如静态类、单例类等)。
    internal static readonly MyClass instance=new singleton()
    新的Singleton()从哪里来?