我有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个通用类,即源和目的地,将完美处理添加和多个 ???
答案 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
类定义Add
和Operation
类:
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
应该继承Engine
,Radio
和Wheel
是不正确的,因为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
}
您可以将其推断为您自己的用例。