1

取景

BaseA -> SubB -> SubSubC

说明:SubSubC 类继承了 SubB 类。SubB 类继承 BaseA 类

BaseA -> SubD -> SubSubE

说明:SubSubE 类继承 SubD 类。SubB 类继承 BaseA 类

很快..

因此,有许多类的祖父类为 BaseA 。BaseA 类具有所有方法共有的一些属性。例如:CustomerID、LastLogin、UniqueName 等。

这就是我正在使用的服务中类的设计方式。

我的疑问是在调用服务方法时,所有方法都需要任何 SubSub 类的参数。谁能告诉我,有什么办法可以在一个地方为 BaseA 的属性赋值,这样在创建 SubSub 对象时我就不需要每次都填充基本属性?

我使用 C# 作为我的语言。

代码:

public class BaseA
    {
        public int CustomerId { get; set; }
        public string UniqueName { get; set; }
    }

    public class SubB : BaseA
    {
    }
    public class SubSubC : SubB
    {

    }

    public class SubD : BaseA
    {
    }
    public class SubSubE : SubD
    {

    }

    public class MyMain
    {
        public void SendRequestToService1()
        {
            (new MyServiceObject()).ServiceMethod1(new SubSubC());
        }

        public void SendRequestToService2()
        {
            (new MyServiceObject()).ServiceMethod2(new SubSubE());
        }
    }

在上面的代码中,在 SendRequestToService1 和 SendRequestToService2 中,我需要初始化基类属性 CustomerId 和 UniqueName。前任:

(new SubSubC(){ CustomerId=2, UniqueName="XXBB" });

如果有很多方法,我需要每次为它们各自的类初始化这些属性。有没有一种方法可以在一个地方初始化基本属性 CustomerId 和 UniqueName,以便继承类(此处为 SubSubC,SubSubE)在创建对象时无需初始化?

4

3 回答 3

2

您是在询问调用基本构造函数吗?如果是这样的话:

class SubSubC : SubB
{
    public object CProperty { get; private set; }
    public SubSubC(object cProperty, string bProperty, int id) : base(bProperty, id)
    {
        CProperty = cProperty;
    }
}
class SubB : BaseA
{
    public string BProperty { get; private set; }
    public SubB(string bProperty, int id) : base(id)
    {
        BProperty = bProperty;
    }
}
class BaseA
{
    public int ID { get; private set; }
    public BaseA(int id)
    {
        ID = id;
    }
}

或者您是在询问如何在方法中初始化对象?如果是这样(假设 setter 在以下代码中是公共的,与前面不同):

void SetSubSubCProperties(SubSubC c, object cProperty, string bProperty, int id)
{
    c.CProperty = cProperty;
    SetSubBProperties(c, bProperty, id);
}
void SetSubBProperties(SubB b, string bProperty, int id)
{
    b.BProperty = bProperty;
    SetBaseAProperties(b, id);
}
void SetBaseAProperties(BaseA a, int id)
{
    a.ID = id;
}

好的,亚历克斯·菲利波维奇的回答,看起来您想通过从不同派生类的实例复制基类属性来初始化派生类的实例。在这种情况下,为了减少亚历克斯回答中的重复,您可以这样做:

void Initialize(BaseA source, BaseA target)
{
    target.CustomerID = source.CustomerID;
    target.UniqueName = source.UniqueName;
}

然后,修改他的例子:

public void SendRequestToService1()
{
    var subSub = new SubSubC();
    Initialize(this.baseA, subSub);
    (new MyServiceObject()).ServiceMethod1(subSub);
}

public void SendRequestToService2()
{
    var subSub = new SubSubE();
    Initialize(this.baseA, subSub);
    (new MyServiceObject()).ServiceMethod2(subSub);
}
于 2012-11-29T06:16:03.653 回答
2

您是否正在寻找以下功能?

    //dummy class replacing the service object and it's methods
    public class MyServiceObject
    {
        public void ServiceMethod1(SubSubC param)
        { }
        public void ServiceMethod2(SubSubE param)
        { }
    }

    public class BaseA
    {
        public int CustomerId { get; set; }
        public string UniqueName { get; set; }
    }

    public class SubB : BaseA
    {
    }
    public class SubSubC : SubB
    {
    }

    public class SubD : BaseA
    {
    }
    public class SubSubE : SubD
    {
    }

    public class MyMain
    {
        //declare the SubSub objects
        //SubSubC subSubC;
        //SubSubE subSubE;
        BaseA baseA;

        public MyMain()
        {
            //assign the values to each class in the MyMain contrsuctor
            baseA = new BaseA { CustomerId = 2, UniqueName = "XXBB" };

        }

        public void SendRequestToService1()
        {
            var subSub=new SubSubC();
            (new MyServiceObject()).ServiceMethod1(Initialize(subSub));
        }

        public void SendRequestToService2()
        {
            var subSub = new SubSubE();
            (new MyServiceObject()).ServiceMethod2(Initialize(subSub));
        }

        private T Initialize<T>(T subSub) where T:BaseA
        {
            subSub.CustomerId = baseA.CustomerId;
            subSub.UniqueName = baseA.UniqueName;
            return subSub;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyMain myMain = new MyMain();
            myMain.SendRequestToService1();
            myMain.SendRequestToService2();
        }
    }
于 2012-12-03T08:12:43.577 回答
0

不确定我是否理解你的问题。

public class A {
  public int ID { get; set; }
}

public class B : A {
}

你可以做B b = new B()然后b.ID = 12


或者,如果您有一个A在服务中获取类型参数的方法,您可以以相同的方式更改该值。

public void doSomething(A a) {
  a.ID = 12;
}

并使用以下实例调用该方法B-doSomething(new B())

于 2012-11-29T06:03:16.917 回答