基于标准类型拥有类型

本文关键字:类型 拥有 标准 于标准 | 更新日期: 2023-09-27 17:54:50

我想拥有自己的基于标准类型的类型。

例如,我想要Dzeta类型,它将作为int工作。

所以我想这样写:

Dzeta i = 0;
i++;

等等

谁能告诉我怎么做这种事?

基于标准类型拥有类型

不能从任何值类型(struct)派生。你只能创建自己的:

public struct Dzeta
{
}

如果需要,还可以重载操作符:

public static Dzeta operator +(Dzeta dz1, Dzeta dz2)
{
   return new Dzeta (/* some operations */);
}

你也可以重载强制转换操作符,所以你可以在使用int的地方使用你的类(强制转换将自动完成):

public static explicit operator int(Dzeta d)
{
    //return some int
}
然后

int a = new Dzeta(); //implicit cast was made!

您需要创建自己的结构体,重载基本操作符和转换。

https://msdn.microsoft.com/ru-ru/library/aa288467 (v = vs.71) . aspx

您可以继承大多数类,但不能继承基类类型,因为它们是密封的。

看看这篇文章:从int32

派生的c#

阅读有关继承的知识也是一个好主意。如果你想使用像c#这样的面向对象语言,你将需要它:)

我使用扩展和覆盖使类的行为像这样

/* A class that behaves a lot like an int */
public class Dzeta
{
    private int __dzeta;
    public Dzeta() { }
    public Dzeta(int i)
    {
        this.__dzeta = i;
    }
    public static Dzeta operator +(Dzeta a, Dzeta b)
    {
        var c = new Dzeta(a.__dzeta + b.__dzeta);
        return c;
    }
    public static Dzeta operator -(Dzeta a, Dzeta b)
    {
        var c = new Dzeta(a.__dzeta - b.__dzeta);
        return c;
    }
    public static Dzeta operator +(Dzeta a, int b)
    {
        var c = new Dzeta(a.__dzeta + b);
        return c;
    }
    public static Dzeta operator -(Dzeta a, int b)
    {
        var c = new Dzeta(a.__dzeta - b);
        return c;
    }
    public override string ToString()
    {
        return __dzeta.ToString();
    }
}
/* Extend the int like behaviors of my DZeta class*/
public static class DZExtensions
{
    public static Dzeta Sum(this Dzeta self, params Dzeta[] all)
    {
        var z = new Dzeta();
        foreach (var dz in all)
            z += dz;
        return z;
    }
    public static Dzeta Sum(this Dzeta self, params int[] all)
    {
        var z = new Dzeta();
        foreach (var dz in all)
            z += dz;
        return z;
    }
}

/* This is how it can be used in the application*/
public class UsageOfDZeta
{
    public void DoSomeDZetaWork()
    {
        var zz = new Dzeta(5);
        System.Diagnostics.Debug.WriteLine(zz);     // prints 5
        zz += 15;
        System.Diagnostics.Debug.WriteLine(zz);     // prints 20
        zz.Sum(10, 5, 20, 5);
        System.Diagnostics.Debug.WriteLine(zz);     // prints 60
    }
}