-2

我的应用程序中有以下代码。

public class GeneralInfo
        {
            private string _id;
            private string _name;           

            public string id
            {
                set
                {
                    _id = value;
                }
                get
                {
                    return _id;
                }
            }

            public string name
            {
                set
                {
                    _name = value;
                }
                get
                {
                    return _name;
                }
            }

        }

       public class SecureInfo
       {
           private string _password;

           public string password
           {
               set
               {
                   _password = value;
               }
               get
               {
                   return _password;
               }
           }

       }


public class User
{
}

我需要在上面的代码中应用多重继承,即。类 GeneralInfo、SecureInfo 属性应该可以在用户类中访问。

我知道使用接口可以实现多重继承。但是我需要在接口中限制的基类中定义属性。

我怎样才能做到这一点?

4

7 回答 7

5

C# 不支持多重继承。但是,您可以通过多个接口来实现这一点。

public interface ISecureInfo 
{

}

public interface IGeneralInfo 
{

} 

public class UserClass : ISecureInfo, IGeneralInfo {

}
于 2013-07-04T13:01:31.810 回答
1

您最好将数据封装在类中,而不是在这里尝试使用某些东西进行多重继承。有关此问题的一些论据,请参见此问题。

于 2013-07-04T13:03:50.117 回答
1

您可以通过基于接口的继承来实现这一点:

public interface IGeneralInfo 
{
    String Id { get; set; }
    String Name { get; set; }
}

public interface ISecureInfo
    String Password { get; set; }
}


public class User : IGeneralInfo, ISecureInfo
{
    // Implementation of IGeneralInfo
    public String Id { get; set; }
    public String Name { get; set; }

    // Implementation of ISecureInfo
    public String Password { get; set; }
}

或者,更进一步,通过组合:

public interface IGeneralInfo 
{
    String Id { get; set; }
    String Name { get; set; }
}

public class GeneralInfo : IGeneralInfo
{
    public String Id { get; set; }
    public String Name { get; set; }
}

public interface ISecureInfo
    String Password { get; set; }
}

public class SecureInfo : IGeneralInfo
{
    public String Password { get; set; }
}

public class User : IGeneralInfo, ISecureInfo
{
    private GeneralInfo generalInfo = new GeneralInfo();
    private SecureInfo secureInfo = new SecureInfo();

    public String Id { 
        get { return generalInfo.Id; }
        set { generalInfo.Id = value; } 
    }
    public String Name { 
        get { return generalInfo.Name; }
        set { generalInfo.Name = value; } 
    }

    public String Password { 
        get { return secureInfo.Password; }
        set { secureInfo.Password = value; } 
    }
}
于 2013-07-04T13:06:14.190 回答
0

我认为最好的办法是将接口的实现和你最后拥有的真实类分开。我的意思是类似于桥接模式。您的类(将实现多个接口)只会将方法调用委托给真正的实现,您可以将其放在单独的地方并且只能使用一次。

于 2013-07-05T01:38:41.380 回答
0

您也可以使用这样的方法。与使用多重继承相比,您将得到相同的结果。这样,如果您不需要 SecureInfo 的东西(即书籍和其他东西),您可以只继承实体。不过,正如其他人所说,我认为在这种情况下作曲会做得更好......

class User : SecuredEntity { }

abstract class SecuredEntity : Entity, ISecureInfo
{
    public string Password { get; set; }
}

abstract class Entity : IGeneralInfo
{
    public string ID { get; set; }
    public string Name { get; set; }
}

interface IGeneralInfo
{
    string ID { get; set; }
    string Name { get; set; }
}

interface ISecureInfo
{
    string Password { get; set; }
}
于 2013-07-27T12:23:02.747 回答
0

您不能在其中进行多重继承,C#因为它不像 C++ 那样受支持。在 C# 中,您可以为其使用接口并实现方法和属性。例如,您可以有一个基类

public abstract class Entity
{
    public string Name { get; set; }

}

你也可以有一些接口:

public interface IPrint
{
   void Print();
}

public interface IGenerate
{
   void Generate();
}

并像多重继承一样使用它(但它不是,它只是一个单一的继承和接口)

public class User : Entity, IPrint, IGenerate
{
   public void Print()
   {
     // some code
     // here you could access Name property, because it is on base class Entity
   } 

   public void Generate()
   {
     // some code
   } 
}

你可以使用抽象来实例化它:

Entity e = new User();
IPrint p = new User();
IGenerate g = new User();
User u = new User();

如果你需要实现,你可以做一个层次继承,例如:

用户从继承自实体的人继承。

public class Entity
{
   public int Id { get; set; }


   public void Method()
   {
      // some code
   }
}

public class Person : Entity
{
   public string Name { get; set; }

   public void AnotherMethod()
   {
      // some code
   }
}

public class User : Person
{
   public string Password { get; set; }

   public bool CheckUser(string name, string passworkd)
   {
      // some code
   }
}
于 2013-07-04T13:02:08.910 回答
0

从您的示例描述中,封装可能是您可能想要使用的:

public class Info{
    GeneralInfo general;
    SecureInfo secure;
...
}
于 2013-07-04T13:05:29.850 回答