如何创建2个通用类来处理2个不同的类初始化?

时间:2016-08-09 10:27:14

标签: c# .net generics

我有3种操作类型:Add,Multiply和Division

以下是处理这3个操作的类:

public class Add
{
   public int Value {get;set;}
   public Add(int value)
   {
      Value=value;
   }
}

以下课程将由上述主要课程调用:

class Source : Add
{
   public Source(int value1)
          :base(value1)
   {
   }
}

class Destination : Add
{
    public Destination(int value2)
          :base(value2)
   {
   }
}

我在上面这样打电话:

Add addObj1 = new Source(10);
Add addObj2 = new Destination(20);
int c=addObj1.Value + addObj2.Value;

现在我有另一个类如下:

public class Multiply
{
   public int Value {get;set;}
   public Multiply(int value)
   {
       Value=value;
   }
}

class Source1 : Multiply
{
   public Source(int value1)
          :base(value)
   {
   }
}

class Destination1 : Multiply
{
    public Destination1 (int value2)
          :base(int value2)
   {
   }
}

现在,当我试图像这样打电话给这个班:

Multiply multiplyObj1 = new Source(10); //This is always referring to Source of Add class
 Multiply multiplyObj2 = new Destination(5); //This is always referring to Destination of Add class

现在,当我使用Source1和Destination1 重命名来源和目的地并按此调用时,它正在运行:

Multiply multiplyObj1 = new Source1(10); //Working
Multiply multiplyObj2 = new Destination1(5); // Working
int c= multipleObj1.Value * multiplyObj2.Value;

注意:现在我创建了4个类,其中Source和Destination将处理Add类,Source1和destination1将处理Multiply

我在谈论如何为Add和Multiply类或其他类重用2个类(对于Division等..)。

现在,如果我想执行分部,那么我再次创建了2个类来处理分区。

所以在这里我不想复制来源和目的地,而不是创建4类,即来源,目的地,来源1和目的地是否可以仅创建 2个通用类,即源和目的地,将完美处理添加和多个 ???

2 个答案:

答案 0 :(得分:3)

现在让我们总结一下您的问题,因为您已经编辑了问题并且已经为您的课程添加了有意义的名称。

你需要......

  • 执行添加
  • 执行乘法

你想要定义基类来统治它们。

首先,这里有一个问题。您不能说添加源乘法源 添加乘法 < / strong>即可。

就像说 cat 既是动物又是矿物质。不,这是一种动物。

这种情况转化为面向对象的编程世界意味着多重继承

// WRONG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! C# doesn't support multiple inheritance
public class Source : Addition, Multiplication 
{
}
BTW,增加的来源也不能成为乘法的来源。这不是技术限制,但是语义限制。这是不对的。 您的设计完全错误。

那么,什么?好吧,我相信你需要重构你的想法和代码,你就会得到你想要的东西。

例如,如果任何数学运算具有相同的表格,我会定义一个类来评估来源:

public class Source
{
    public Source(int value) 
    {
         Value = value;
    }

    public int Value { get; }
}

然后我会根据Multiply类定义AddOperation类:

public abstract class Operation
{
      public Operation(Source sourceA, Source sourceB)
      {
           SourceA = sourceA;
           SourceB = sourceB;
      }

      public Source SourceA { get; }
      public Source SourceB { get; }

      public abstract int Do();
}

public class Add : Operation
{
      public Operation(Source sourceA, Source sourceB) : base(sourceA, sourceB)
      {
      }

      public override int Do() => SourceA.Value + SourceB.Value;
}

public class Multiply : Operation
{
      public Operation(Source sourceA, Source sourceB) : base(sourceA, sourceB)
      {
      }

      public override int Do() => SourceA.Value * SourceB.Value;
}

现在,您只有一个数学运算源,只需一个基类来总结任何操作的共同点,以及已经实现的两个操作。

请注意,您可以利用多态,因为任何操作都会继承Operation

Source sourceA = new Source(203);
Source sourceB = new Source(134);

Operation op1 = new Multiply(sourceA, sourceB);
Operation op2 = new Add(sourceA, sourceB);

int result1 = op1.Do();
int result2 = op2.Do();

我相信这可能是一种可行且可接受的设计。

答案 1 :(得分:2)

可能您的实际使用案例并不喜欢继承,您需要使用撰写。请仔细检查我几天前做的其他答案:Define a variable of one class from another class

让我们使用一个真实案例:Car

Car有......

  • Engine
  • Radio
  • Wheel

说具体Car应该继承EngineRadioWheel是不正确的,因为Car拥有它们,但他们不是汽车,而是整个Car的一部分。

当你到达这个结论是因为你需要组成

public class Car
{
     public Engine Engine { get; set; }
     public Wheel Wheel { get; set; }
     public Radio Radio { get; set; }
}

这样一来,混凝土车,让我们说Ferrari可以继承默认情况下Car所拥有的一切,它也可以添加更多组件

public class FerrariTestarossa : Car
{
     // More properties and methods that make a FerrariTestarossa unique
     // from a generic car
}

您可以将其推断为您自己的用例。