C# 用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();
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()从哪里来?